В Django, как составить таблицы из файла SQL, когда syncdb выполняется

Как я заставляю syncdb выполнить SQL-запросы (для создания таблицы) определенный мной, скорее затем генерируя таблицы автоматически.

Я ищу это решение, поскольку некоторые конкретные модели в моем приложении представляют табличные представления SQL для таблицы унаследованной базы данных. Так, я создал их представления SQL в своем django-DB как это:

CREATE VIEW legacy_series AS ВЫБИРАЕТ * ИЗ legacy.series;

У меня есть перепроектированная модель, которая представляет вышеупомянутое view/legacytable. Но каждый раз, когда я выполняю syncdb, я должен создать все представления сначала путем запущения sql скриптов, иначе syncdb просто составляет таблицы для них (если представление не найдено).

Как я заставляю syncdb выполнить вышеупомянутый SQL?

5
задан Clément 13 April 2010 в 10:36
поделиться

2 ответа

Вы можете использовать неуправляемые модели для ваших реконструированных моделей и исходные сценарии 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 как обычно и начать использовать устаревшие модели.

4
ответ дан 14 December 2019 в 01:04
поделиться

Я знаю 2 возможных подхода для адаптации ваших моделей к устаревшей таблице базы данных (без использования представлений):

1) Запустите python manage.py inspectdb в вашем проекте. Это сгенерирует модели для существующих таблиц базы данных, после чего вы сможете продолжить работу с ними.

2) Измените таблицы с помощью некоторых специфических настроек. Прежде всего, вы определяете имя таблицы в своей модели, устанавливая опцию db_table в ваших мета-опциях. Во-вторых, вы определяете для каждого поля имя столбца в соответствии с вашей устаревшей базой данных, устанавливая опцию db_column. Обратите внимание, что есть другие перечисленные параметры db_, которые вы, возможно, могли бы использовать для сопоставления с вашей устаревшей базой данных.

Если вы действительно хотите, чтобы представления подходили к (уродливому) обходному пути, вы можете определить настраиваемые команды sql для каждой модели приложения. Этот файл находится в "application" / sql / "model" .sql. Django вызовет этот sql после создания всех таблиц.Вы можете попробовать указать операторы DROP для сгенерированных таблиц, за которыми следует оператор создания представления в этом файле. Обратите внимание, что это будет немного сложно для таблиц с внешними ключами, поскольку django не гарантирует никакого порядка выполнения этих файлов (так что размещение всех операторов в одном .sql будет самым простым способом, я думаю, я никогда не пробовал этого раньше).

5
ответ дан 14 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: