Предыдущая часть.
Мы написали код, теперь время создать таблицы в нашей базе данных. Что бы сделать это — сначала на «активировать» наши модули в нашем 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: основы доступа к данным.