В Django, как создавать таблицы из файла SQL при запуске syncdb - PullRequest
5 голосов
/ 13 апреля 2010

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

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

СОЗДАТЬ ВИД legacy_series КАК ВЫБРАТЬ * ИЗ legacy.series;

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

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

Ответы [ 2 ]

5 голосов
/ 13 апреля 2010

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

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

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

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

4 голосов
/ 13 апреля 2010

Вы можете использовать неуправляемые модели для моделей с обратным проектированием и исходные сценарии SQL для создания ваших представлений.

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...