Django - Compare Model Code to Database

I maintain a Django project with a database that has several model constraints that have fallen out of sync with the actual database. So, for example, some model fields have null=False set, but the database permits NULLs for the corresponding database column.

I'm curious if there is a utility, either in Django or a third-party Python script, that will compare the SHOW CREATE TABLE output (in this case, using MySQL syntax) for each table and compare it with the python manage.py sql output, to highlight the discrepancies.

Granted, in an ideal situation, the database wouldn't fall out of sync with the Django model code in the first place, but since that's where I am, I'm curious if there's a solution to this problem before I write one myself or do the comparison manually.

8
задан Jim McGaw 23 August 2010 в 19:11
поделиться

2 ответа

./ manage.py inspectdb создает файл модели, соответствующий моделям, существующим в базе данных.

Вы можете сравнить его с файлами вашей текущей модели, используя стандартный unix diff или любой другой необычный инструмент сравнения , чтобы найти разницу и спланировать свою стратегию миграции.

Хотя первое кажется проще и лучше, вы также можете увидеть разницу на уровне sql. ./ manage.py sqlall генерирует sql для текущей схемы db и, соответственно, show create table table-name показывает sql для создания таблицы.

Возможно, вы захотите сослаться на http://code.google.com/p/django-evolution/ , который однажды автоматически перенес состояние базы данных в текущую модель. - Однако учтите, что этот проект старый и кажется заброшенным.

4
ответ дан 5 December 2019 в 18:55
поделиться

Я придумал быстрый и грязный способ сделать то, что я описал. Это не идеально, но если вы запустите ./manage.py testserver, тестовая база данных будет создана на основе кода модели. Затем (используя специфический для MySQL синтаксис), вы можете сбросить схему для обычной базы данных и тестовой базы данных в файлы:

$ mysqldump -uroot -p [database_name] --no-data=true > schema.txt
$ mysqldump -uroot -p [test_database_name] --no-data=true > test_schema.txt

Затем вы можете просто diff schema.txt и test_schema.txt и найти различия.

3
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

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