我维护一个Django项目,该项目的数据库有几个与实际数据库不同步的模型约束。因此,例如,某些模型字段具有null = False set,但数据库允许相应数据库列的NULL。
我很好奇是否有一个实用工具,无论是在Django还是第三方Python脚本中,它将比较每个表的SHOW CREATE TABLE输出(在本例中,使用MySQL语法)并将其与python进行比较manage.py sql输出,突出显示差异。
当然,在理想的情况下,数据库首先不会与Django模型代码不同步,但是因为我就是这样,我很好奇在我写这个问题之前是否有解决方案一个人自己或手动做比较。
答案 0 :(得分:4)
./manage.py inspectdb
生成与数据库中存在的模型对应的模型文件。
您可以使用标准的unix差异或任何其他花哨diffing tool将其与当前模型文件区分开来,以找出差异并规划迁移策略。
虽然前者看起来更简单,更好,但您也可以在sql级别看到差异。 ./manage.py sqlall
为当前的db模式生成sql,相应地show create table table-name
显示用于创建表的sql。
您可能希望将自动迁移db状态的http://code.google.com/p/django-evolution/引用到当前模型中的状态。 - 但请注意,这个项目很旧,似乎已经放弃了。
答案 1 :(得分:3)
我确实提出了一种快速而肮脏的方法来做我所描述的事情。它并不完美,但如果运行./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
然后你可以简单地区分schema.txt和test_schema.txt并找到差异。
答案 2 :(得分:2)
对于PostgreSQL,在临时空数据库上执行manage.py syncdb
,然后使用pg_dump -sOx
转储生产和临时数据库,并比较生成的文件。在视觉差异工具中,至少GNOME Meld似乎能很好地应对PostgreSQL转储。