所以大约一年前,我开始了一个项目,像所有新开发人员一样,我并没有真正关注结构,但是现在我与Django一起开始显示我的项目布局主要是我的模型结构很糟糕.
我的模型主要存放在一个应用程序中,并且这些模型中的大多数应该在他们自己的个人应用程序中,我确实尝试解决这个并将它们移动到南方然而我发现它很棘手并且由于外键等而非常困难.
但是由于Django 1.7和内置的迁移支持,现在有更好的方法吗?
根据这里的文档:https: //docs.djangoproject.com/en/1.8/topics/migrations/它说:
migrate, which is responsible for applying migrations, as well as unapplying and listing their status.
Run Code Online (Sandbox Code Playgroud)
和
makemigrations, which is responsible for creating new migrations based on the changes you have made to your models.
Run Code Online (Sandbox Code Playgroud)
据我所知,我先做
makemigrations
Run Code Online (Sandbox Code Playgroud)
创建迁移文件,然后执行
migrate
Run Code Online (Sandbox Code Playgroud)
实际应用迁移?
请注意,我刚刚开始我的Django项目,并将我的应用程序添加到我的"installed_apps"列表中.在那之后,我做到了
python manage.py runserver
Run Code Online (Sandbox Code Playgroud)
它说
You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.
Run Code Online (Sandbox Code Playgroud)
它没有提到任何关于运行makemigrations的内容.
这是这个问题的扩展:如何在两个Django应用程序之间移动模型(Django 1.7)
我需要将一堆模型从中移动old_app到new_app.最好的答案似乎是Ozan的,但是需要外键引用,事情有点棘手.@halfnibble在对Ozan的答案的评论中提出了一个解决方案,但我仍然遇到了精确的步骤顺序问题(例如,何时将模型复制到new_app,何时删除模型old_app,哪些迁移将在old_app.migrationsvs中进行.new_app.migrations等)
任何帮助深表感谢!
我非常喜欢Rails的数据库迁移管理系统.它不是100%完美,但它可以做到这一点.Django没有附带这样的数据库迁移系统(但是?)但是有很多开源项目可以做到这一点,例如django-evolution和south.
所以我想知道,您更喜欢django的数据库迁移管理解决方案?(每个答案一个选项请)
我最近一直在简短地看JPA,我想知道数据库架构迁移的交易是什么,并且与你创建的类保持一致.
JPA对这个东西有支持吗?公用事业?最佳实践?
干杯!
我重写了很多我的模型,因为我只是运行一个测试服务器,我做./manage.py重置myapp来重置db表,一切都运行正常.
但这次我试着这样做,我得到一个错误,
"myapp_tagger"关系的"完整错误:contraint owner_id_refs_id_9036cedd"不存在"
所以我想我会把整个网站搞得一团糟,重新开始.所以我做了./manage.py flush然后做了一个syncdb这没有引发错误并删除了我的所有数据,但是它没有更新数据库,因为当我尝试访问任何my_app的对象时,我得到一个列未找到错误.我认为同花顺应该放弃所有桌子.syncdb表示没有添加任何灯具.
我假设错误与我将标记器模型更改为具有名称所有者绑定到另一个对象的外键的事实有关.
我已经尝试将related_name添加到foreignkey参数,似乎没有任何工作.
我犯了一个愚蠢的错误,就是在同一个Django应用程序中创建太多模型,现在我想把它分成3个不同的模型.问题是:在两个客户的站点中已经有生产数据,所以我需要仔细规划任何模式/数据迁移(我正在使用django-south).我不确定如何继续,任何建议将不胜感激.
(我在Ubuntu服务器12.4 LTS上使用PostgreSQL,如果有任何相关性)
我考虑过使用db.rename_table,但是无法弄清楚如何正确地将外键更新为那些模型(从旧到新) - 在数据库级别无关紧要(因为表重命名已经覆盖了),但在ORM级别则不然.
更新:在考虑之后,在对programmmers.SE 提出这个问题后,我决定保持简单,不要担心产品主要版本之间的迁移.短期内,我将使用db.rename_table匹配新名称,同时也使用db_table丹尼尔罗斯曼建议,一直保持模型在旧的应用程序.当升级到主要版本时,我开始使用新应用程序并完全放弃所有迁移(因此,新版本的新安装将"按原样"创建数据库,而不是完成所有历史迁移).
我正在尝试使用该app/console doctrine:schema:update --force命令进行架构更新,但Doctrine在以下部分失败:
An exception occurred while executing 'DROP INDEX IDX_E98F2859A074D5D7 ON contract':
SQLSTATE[HY000]: General error: 1553 Cannot drop index 'IDX_E98F2859A074D5D7': needed in a foreign key constraint
Run Code Online (Sandbox Code Playgroud)
根据另一个SO问题解决这个问题是微不足道的.该表有:
KEY `IDX_E98F2859A074D5D7` (`some_table_id`),
CONSTRAINT `FK_E98F2859A074D5D7` FOREIGN KEY (`some_table_id`) REFERENCES `some_table` (`id`)
Run Code Online (Sandbox Code Playgroud)
所以这可以通过删除匹配约束来手动解决.但有没有办法自动完成?
我想禁用用户对我的应用程序的访问,以便我可以执行架构迁移。我研究了几种可能性并发现了可能的缺点:
禁用数据存储写入 - 我宁愿关闭我的整个应用程序,以便人们看不到任何错误等。此外,我认为禁用写入将阻止我执行迁移。
禁用应用程序 - 我不清楚这只会对我的用户禁用它,使我无法执行迁移。我也不确定禁用/启用周转时间。
将我的域名重定向到一个临时页面 - 我的应用程序仍然可以在 appspot.com 上访问
上传我的应用程序的新版本,除了定向到“暂时关闭”页面之外,它不会响应请求。
有什么建议?
我们基于Firestore DB的模型自然发展。现在,我们想将所有现有文档更新为新的(隐式)架构。
是否有任何工具支持这一点或最佳实践是什么?我希望有一个与Rails ActiveRecord迁移相当的概念。
schema-migration ×10
django ×5
database ×4
python ×3
django-south ×2
mysql ×2
doctrine ×1
jpa ×1