使用Postgres BDR 9.4.1进行Django 1.8迁移

时间:2015-09-23 20:11:35

标签: django postgresql migration replication postgresql-bdr

我正在尝试使用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表是否会复制。

有人有任何建议吗?

2 个答案:

答案 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限制。