Django - 比较模型代码和数据库

9

我维护一个Django项目,其中数据库有几个模型限制与实际数据库不同步。例如,一些模型字段设置了null=False,但是对应的数据库列允许NULL。

我想知道是否有一种工具,无论是在Django还是第三方Python脚本中,可以比较每个表的SHOW CREATE TABLE输出(在这种情况下,使用MySQL语法),并将其与python manage.py sql输出进行比较,以突出显示差异。

当然,在理想情况下,数据库不会首先与Django模型代码失步,但既然我已经处于这个位置,我想知道在我自己编写或手动比较之前,是否有解决此问题的方法。


为什么不使用类似于 http://www.quickdiff.com/index.php 的 diff 工具来比较它们呢? - Gabi Purcaru
@Gabi- 这就是我手动完成的工作。我很好奇是否有人创建了一个实用程序,可以为每个生成输出,以便我可以轻松地进行差异比较。目前这样做也可以,但是每个输出并不对齐,所以我必须逐个表格进行处理。 - Jim McGaw
3个回答

5

./manage.py inspectdb 生成与数据库中存在的模型对应的模型文件。

您可以使用标准的Unix diff或任何其他高级 差异工具 查找差异并计划迁移策略,然后将其与当前的模型文件进行比较。

虽然前者似乎更简单、更好,但您也可以查看 SQL 级别的 diff。 ./manage.py sqlall 会生成当前数据库架构的 SQL,并且相应地 show create table table-name 可以显示创建表的 SQL。

您可能希望参考 http://code.google.com/p/django-evolution/,该项目曾经自动将数据库状态迁移到当前模型中的状态。请注意,这个项目已经很老了,而且似乎已经被放弃了。


谢谢,Lakshman。diff实用程序非常好用;事实上,这就是我正在使用的。我正在寻找一个实用程序,它可以运行settings.INSTALLED_APPS中的所有模型,并显示每个模型的sql,然后在数据库中显示SHOW CREATE TABLE sql,产生两个结构相似且易于进行差异比较的输出。我知道这可能无法完全自动化,但我很想知道是否有人解决了这个问题。 - Jim McGaw
Jim,这就是为什么我建议你看看django-evolution的原因。 - lprsd
Lakshman,我看了一下django-evolution。对于数据库维护来说非常有用;谢谢你的分享。 - Jim McGaw

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 文件,并查找它们之间的差异。

快速而粗略,低级别!我喜欢差异在数据库模式上的事实,简单明了。谢谢。 - Fafaman

2
对于PostgreSQL,可以在一个临时的空数据库上执行manage.py syncdb,然后使用pg_dump -sOx将生产和临时数据库转储,并比较生成的文件。在可视化差异工具中,至少GNOME Meld似乎能够很好地处理PostgreSQL转储。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接