Как я заставляю syncdb выполнить SQL-запросы (для создания таблицы) определенный мной, скорее затем генерируя таблицы автоматически.
Я ищу это решение, поскольку некоторые конкретные модели в моем приложении представляют табличные представления SQL для таблицы унаследованной базы данных. Так, я создал их представления SQL в своем django-DB как это:
CREATE VIEW legacy_series AS ВЫБИРАЕТ * ИЗ legacy.series;
У меня есть перепроектированная модель, которая представляет вышеупомянутое view/legacytable. Но каждый раз, когда я выполняю syncdb, я должен создать все представления сначала путем запущения sql скриптов, иначе syncdb просто составляет таблицы для них (если представление не найдено).
Как я заставляю syncdb выполнить вышеупомянутый SQL?
Вы можете использовать неуправляемые модели для ваших реконструированных моделей и исходные сценарии SQL для создания ваших представлений.
РЕДАКТИРОВАТЬ :
Немного более подробный ответ. Когда вы используете неуправляемые модели, syncdb
не будет создавать таблицы базы данных за вас, поэтому вы должны позаботиться об этом самостоятельно. Важным моментом является имя таблицы и то, как django отображает классы Model
в имена таблиц, я предлагаю вам прочитать документ по этому вопросу .
В основном ваша модель Series
будет выглядеть так:
class Series(models.Model):
# model fields...
...
class Meta:
managed = False
db_table = "legacy_series"
Затем вы можете поместить свои команды SQL в файл yourapp / sql / series.sql
:
### yourapp/sql/series.sql
CREATE VIEW legacy_series AS SELECT * FROM legacy.series;
Затем вы можете syncdb
как обычно и начать использовать устаревшие модели.
Я знаю 2 возможных подхода для адаптации ваших моделей к устаревшей таблице базы данных (без использования представлений):
1) Запустите python manage.py inspectdb в вашем проекте. Это сгенерирует модели для существующих таблиц базы данных, после чего вы сможете продолжить работу с ними.
2) Измените таблицы с помощью некоторых специфических настроек. Прежде всего, вы определяете имя таблицы в своей модели, устанавливая опцию db_table в ваших мета-опциях. Во-вторых, вы определяете для каждого поля имя столбца в соответствии с вашей устаревшей базой данных, устанавливая опцию db_column. Обратите внимание, что есть другие перечисленные параметры db_, которые вы, возможно, могли бы использовать для сопоставления с вашей устаревшей базой данных.
Если вы действительно хотите, чтобы представления подходили к (уродливому) обходному пути, вы можете определить настраиваемые команды sql для каждой модели приложения. Этот файл находится в "application" / sql / "model" .sql. Django вызовет этот sql после создания всех таблиц.Вы можете попробовать указать операторы DROP для сгенерированных таблиц, за которыми следует оператор создания представления в этом файле. Обратите внимание, что это будет немного сложно для таблиц с внешними ключами, поскольку django не гарантирует никакого порядка выполнения этих файлов (так что размещение всех операторов в одном .sql будет самым простым способом, я думаю, я никогда не пробовал этого раньше).