Предыдущая часть.
Мы написали код, теперь время создать таблицы в нашей базе данных. Что бы сделать это – сначала на “активировать” наши модули в нашем Django-проекте. Мы сделаем это, добавив приложение books
в список установленных приложений в файле настроек.
Откройте файл settings.py
в редакторе и найдите опцию INSTALLED_APPS
. Она указывает Django, какие приложения активны в данном проекте. По умолчанию она будет выглядеть примерно так:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', )
Пока что – закомментируйте все приложения в этом списке, указав символ #
в начале строки (они включены по умолчанию, для удобства использования Django, но мы активируем и обсудим их в следующих главах). Когда вы это сделаете – закомментируйте так же настройки в MIDDLEWARE_CLASSES
– значения там зависят от некоторых приложений, которые мы только что закомментировали. Затем – добавьте ‘books
‘ в список INSTALLED_APPS
, что бы настройки выглядели примерно так:
MIDDLEWARE_CLASSES = ( # 'django.middleware.common.CommonMiddleware', # 'django.contrib.sessions.middleware.SessionMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 'django.contrib.auth.middleware.AuthenticationMiddleware', # 'django.contrib.messages.middleware.MessageMiddleware', )
INSTALLED_APPS = ( # 'django.contrib.auth', # 'django.contrib.contenttypes', # 'django.contrib.sessions', # 'django.contrib.sites', # 'django.contrib.messages', # 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'books', )
(Как мы уже упоминали в предыдущей главе – убедитесь, что добавили закрывающую запятую в INSTALLED_APPS
, так как это кортеж с одним элементом. Кстати, авторы этой книги предпочитают указывать запятую после каждого элемента в кортеже, незаивисмо от того – содержится ли в кортеже один или несколько элементов. Это помогает избежать проблем с “забытыми” запятыми.)
‘books
‘ указывает на приложение, над которым мы работаем. Каждое приложение в INSTALLED_APPS
представлено полным путём в стиле Python – т.е., путь указывается с помощью точек, и ведёт к пакету с приложением.
Теперь, когда приложение активировано в файле настроек, мы можем создать таблицы в базе данных. Для начала – давайте проверим корректность наших моделей, выполнив команду:
$ python manage.py validate 0 errors found
Команда validate
проверяем синтаксис и логику ваших моделей. Если будут обнаружены ошибки – будет выведена полная трассировка выполнения, которая поможет её обнаружить.
Каждый раз, когда вы подозреваете наличие ошибки в ваших моделях – используйте python manage.py validate
, что бы её обнаружить.
Если с вашими моделями всё в порядке – выполните следующую команду, что бы сгенерировать запрос CREATE TABLE
для ваших моделей в приложении books
:
$ python manage.py sqlall books
В этой команде books
– имя вашего приложения. Когда вы выполните её – вы должны увидеть что-то вроде такого:
BEGIN; CREATE TABLE `books_publisher` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `address` varchar(50) NOT NULL, `city` varchar(60) NOT NULL, `state_province` varchar(30) NOT NULL, `country` varchar(50) NOT NULL, `website` varchar(200) NOT NULL ) ; CREATE TABLE `books_author` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `first_name` varchar(30) NOT NULL, `last_name` varchar(40) NOT NULL, `email` varchar(75) NOT NULL ) ; CREATE TABLE `books_book_authors` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `book_id` integer NOT NULL, `author_id` integer NOT NULL, UNIQUE (`book_id`, `author_id`) ) ; ALTER TABLE `books_book_authors` ADD CONSTRAINT `author_id_refs_id_9e7e386` FOREIGN KEY (`author_id`) REFERENCES `books_author` (`id`); CREATE TABLE `books_book` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(100) NOT NULL, `publisher_id` integer NOT NULL, `publication_date` date NOT NULL ) ; ALTER TABLE `books_book` ADD CONSTRAINT `publisher_id_refs_id_c5b274bb` FOREIGN KEY (`publisher_id`) REFERENCES `books_publisher` (`id`); ALTER TABLE `books_book_authors` ADD CONSTRAINT `book_id_refs_id_cfbcf262` FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`); CREATE INDEX `books_book_22dd9c39` ON `books_book` (`publisher_id`); COMMIT;
Обратите внимание на такие моменты:
- Имена таблиц генерируются автоматически из имени приложения (
books
) и имени модели (publisher
,book
иauthor
). Вы можете изменить это, как описано в Приложении В. - Как уже упоминалось – Django создаёт первичный ключ для каждой таблицы автоматически, и это тоже можно изменить.
- По умолчанию – Django добавляет “
_id
” к имени поля foreign key. Как вы догадываетесь – это тоже настраивается. - Связи внешних ключей заданы явно, с помощью оператора
REFERENCES
. - Этот вызов
CREATE TABLE
создаётся с учётом используемого сервера баз данных, поэтому специфичные типы, такие какauto_increment
(MySQL),serial
(PostgreSQL) илиinteger primary key
(SQLite) обрабатываются автоматически. То же касается и кавычек вокруг имён таблиц (например – использовать двойные или одинарные кавычки). Пример выше приведён для MySQL.
Команда sqlall
не создаёт таблиц в базе данных – она только выводит SQL запрос, что бы вы могли проверить что именно Django будет делать с базой. Если вы хотите – вы можете скопировать и вставить этот запрос в SQL-клиент, или использовать Unix-pipe, что бы передать его напрямую (например – python manage.py sqlall books | mysql mydb
). Однако, Django предоставляет более простой путь для выполнения этого запроса к базе: это команда syncdb
:
$ python manage.py syncdb
Выполните её, и вы должны будете увидеть что-то вроде такого:
Creating tables ... Creating table books_publisher Creating table books_author Creating table books_book_authors Creating table books_book Installing custom SQL ... Installing indexes ... No fixtures found.
Команда syncdb
просто “синхронизирует” ваши модели с базой данных. Она проверяет все модели во всех приложениях, которые указаны в параметре INSTALLED_APPS
, проверяет базу на наличие таблиц, и создаёт их, если таблиц ещё нет. Помните, что syncdb
не выполняет синхронизацию изменений или удалений из моделей. Если вы изменили или удалили модель, и хотите обновить базу – syncdb
не предназначена для этого (больше об этом мы поговорим в конце главы).
Если вы выполните python manage.py syncdb
ещё раз – то ничего не произойдёт, потому что вы не добавлили никаких моделей в приложение books
, и не добавили никаких прилождений в INSTALLED_APPS
. Так что – вполне безопасно запускать syncdb
– она ничего не поломает.
Если вам интересно – то потратьте время, и посмотрите на созданные Django таблицы в базе:
MariaDB [django_example1]> show tables; +---------------------------+ | Tables_in_django_example1 | +---------------------------+ | books_author | | books_book | | books_book_authors | | books_publisher | +---------------------------+
MariaDB [django_example1]> desc books_author; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | first_name | varchar(30) | NO | | NULL | | | last_name | varchar(40) | NO | | NULL | | | email | varchar(75) | NO | | NULL | | +------------+-------------+------+-----+---------+----------------+
Вы можете подключиться к серверу баз данных вручную, через стандартный клиент, либо запустить python manage.py dbshell
, которая определит подходящий клиент, в зависимости от настроек DATABASE_SERVER
, и подключится с указанным пользователем, паролем, к указанной базе данных.
Продолжение – Django Book: основы доступа к данным.