Django - сравнить код модели с базой данных - PullRequest
8 голосов
/ 23 августа 2010

Я поддерживаю проект Django с базой данных, которая имеет несколько ограничений модели, которые не синхронизированы с реальной базой данных.Так, например, для некоторых полей модели установлено значение null = False, но база данных допускает значения NULL для соответствующего столбца базы данных.

Мне любопытно, есть ли утилита, либо в Django, либо в стороннем Pythonскрипт, который будет сравнивать вывод SHOW CREATE TABLE (в данном случае, используя синтаксис MySQL) для каждой таблицы и сравнивать его с выводом python manage.py sql, чтобы выделить несоответствия.

Конечно, в идеальной ситуации база данных не будет не синхронизирована с кодом модели Django, но, поскольку я здесь, мне интересно, есть ли решение этой проблемы?прежде чем написать сам или сделать сравнение вручную.

Ответы [ 3 ]

4 голосов
/ 24 августа 2010

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

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

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

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

3 голосов
/ 24 августа 2010

Я придумал быстрое и грязное средство для выполнения того, что я описал.Это не идеально, но если вы запустите ./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 diffmama.txt и test_schema.txt и найти различия.

2 голосов
/ 04 апреля 2011

Для PostgreSQL выполните manage.py syncdb для временной пустой базы данных, затем выведите рабочие и временные базы данных с pg_dump -sOx и сравните полученные файлы.Среди инструментов визуального сравнения, по крайней мере, GNOME Meld хорошо справляется с дампами PostgreSQL.

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