【问题标题】:Django - Compare Model Code to DatabaseDjango - 将模型代码与数据库进行比较
【发布时间】:2011-04-02 19:52:12
【问题描述】:

我维护一个 Django 项目,该项目的数据库具有多个与实际数据库不同步的模型约束。因此,例如,某些模型字段设置了 null=False,但数据库允许相应的数据库列为 NULL。

我很好奇 Django 或第三方 Python 脚本中是否有一个实用程序,它将比较每个表的 SHOW CREATE TABLE 输出(在这种情况下,使用 MySQL 语法)并将其与 python 进行比较manage.py sql 输出,以突出差异。

当然,在理想情况下,数据库一开始不会与 Django 模型代码不同步,但既然我就是这样,在我写之前我很好奇这个问题是否有解决方案一个自己或手动进行比较。

【问题讨论】:

  • 为什么不将它们与差异工具进行比较,例如quickdiff.com/index.php
  • @Gabi- 这就是我手工做的。我很好奇是否有人创建了一个实用程序来为每个我可以轻松区分的输出生成输出。就像现在一样,效果很好,但是每个的输出都没有对齐,所以我必须逐表进行。

标签: database django django-models


【解决方案1】:

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

您可以使用标准的 unix diff 或任何其他花哨的 diffing tool 将其与当前模型文件进行比较,以找出差异并规划您的迁移策略。

虽然前者看起来更简单更好,但您也可以在 sql 级别看到差异。 ./manage.py sqlall 为当前 db 模式生成 sql,并相应地 show create table table-name 显示用于创建表的 sql。

您可能需要参考http://code.google.com/p/django-evolution/,它曾经将数据库的状态自动迁移到当前模型中的状态。 - 但请注意,这个项目很旧,似乎已被废弃。

【讨论】:

  • 谢谢,拉克什曼。 diff 实用程序运行良好;确实,这就是我正在使用的。我正在寻找一个实用程序,它可以在 settings.INSTALLED_APPS 中运行所有模型并显示每个模型的 sql,然后显示数据库中的 SHOW CREATE TABLE sql,产生两个结构相似的输出,可以很容易地区分。我知道这可能无法完全实现自动化,但我很好奇是否有人解决了这个问题。
  • Jim,这就是为什么我提到你要看 django-evolution。
  • Lakshman,我看过 django-evolution。看起来对数据库维护很有用;感谢分享。
【解决方案2】:

我确实想出了一种快速而肮脏的方法来做我所描述的事情。它并不完美,但如果你运行./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 并找出不同之处。

【讨论】:

  • 又快又脏,而且级别低!我喜欢差异在 DB 模式上的事实,简单明了。谢谢。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多