我正在尝试使用BDR在Postgres数据库上运行Django迁移。
python manage.py makemigrations
工作正常,但正在运行
python manage.py migrate
导致以下错误:
ALTER TABLE … ALTER COLUMN TYPE … may only affect UNLOGGED or TEMPORARY tables when BDR is active; auth_permission is a regular table
违规模块为django/django/contrib/auth/migrations/0002_alter_permission_name_max_length.py
。
我没有找到任何关于如何使用Django的UNLOGGED表,特别是因为auth_permissions是一个Django表(不是我创建的)。我也不确定UNLOGGED表是否会复制。
有人有任何建议吗?
答案 0 :(得分:6)
要使用BDR进行迁移,您需要手动创建迁移,仅使用" safe"操作,因为BDR目前无法复制迁移过程中的操作。
在最近我在第二象限(BDR开发的主要赞助商)的支持下的电子邮件对话中,我收到了有关该主题的信息:
没有时间表来实现这一目标。这很难实现。
您仍然可以更改列的类型,它只需要多个步骤。在 一般来说,你在BDR中做DDL,好像你是用它来做的 库存PostgreSQL中的锁定避免方法。所以在这种情况下你:
- 添加没有DEFAULT且没有任何NOT NULL的新列,并提交。如果需要,还可以创建一个触发器来自动填充新的 插入值时的列。或者更改新列以设置a 默认,如果这更合适。
- 更新表格以使用新类型
将值复制到新列- 如果合适的话,改变表格使其成为非空
- 删除旧列
我还发现this article from BrainTree是一个很好的参考,可以考虑什么"安全"操作,以及如何重写迁移中的行为。
答案 1 :(得分:2)
您可以使用MIGRATION_MODULES设置覆盖auth app的内置迁移,例如:
MIGRATION_MODULES = {
'auth': 'bdr_migrations.auth',
}
然后将迁移文件从django包复制到/ project / bdr_migrations / auth /并调整它们以匹配BDR限制。