FAQ: Базы данных и модели

Как посмотреть SQL, который генерирует Django?

Установите DEBUG в True и проделайте следующее:

>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]

connection.queries доступны только при включённой отладке. Это обычный словарь выполняемых запросов, каждый из которых содержит следующее:

``sql`` -- The raw SQL statement
``time`` -- How long the statement took to execute, in seconds.

connection.queries включает в себя все SQL запросы: INSERT, UPDATE, SELECT... Каждый раз, когда приложение обращается к БД, запросы протоколируются. Внимание, могут быть проблемы с incorrectly quoted under SQLite

Если вы используете multiple databases, то для каждого словаря connections есть свои интерфейсы.

>>> from django.db import connections
>>> connections['my_db_alias'].queries

Могу ли я использовать Django вместе с уже существующей БД?

Да, подробнее здесь - Integrating with a legacy database

После изменений в модели как обновить базу данных?

Если это не удаление данных, то для manage.py есть команда flush, которая сбрасывает состояние БД на момент непосредственно после выполнения syncdb.

Если же вы удаляли данные, то извините - только вручную через ALTER TABLE.

Это external projects which handle schema updates, которое де-факто стандарт для миграций - south.

Поддерживает ли Django составные главные ключи?

Нет, поддерживаются только главные ключи, состоящие из одного столбца.

На практике это не является проблемой, так как не мешает добавлению других ограничений (с использованием ключа unique_together в модели или условий в БД), обеспечив уникальность на этом уровне. Главный ключ из одного столбца нужен, например, для работы интерфейса администратора - должен быть простой способ определить объект для изменения или удаления.

Как добавить СУБД-специфичные опции (например, тип таблицы MyISAM) в выражение CREATE TABLE?

Мы стараемся избегать добавления таких специфичных настроек в код Django. Если же это действительно нужно, то создайте SQL initial data file, который будет содержать выражение ALTER TABLE для тонкой настройки. Оно будет выполнено непосредственно после CREATE TABLE.

Например, при использовании MySQL для указания типа таблицы MyISAM создайте такой файл со следующим содержимым:

ALTER TABLE myapp_mytable ENGINE=MyISAM;

Согласно документации SQL initial data file, этот файл может содержать любые SQL выражения, так что вы можете производить любые изменения.

Почему Django жрёт так много памяти?

Известных утечек памяти у Django нет. Если вы заметили, что Django кушает всё больше и больше памяти, не освобождая её, то установите DEBUG в False. В противном случае Django хранит все копии запросов, которые были выполнены.

(Запросы сохраняются в django.db.connection.queries, подробнее в `How can I see the raw SQL queries Django is running?`_.)

Для решения проблемы установите DEBUG в False.

Для очистки списка запросов вручную вызовите reset_queries(), например:

from django import db
db.reset_queries()