4

我正在尝试使用 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 取消记录表的信息,尤其是因为 auth_permissions 是一个 Django 表(不是我创建的)。我也不确定 UNLOGGED 表是否会复制。

有人有建议吗?

4

2 回答 2

6

为了将迁移与 BDR 一起使用,您需要手动创建迁移,仅使用“安全”操作,因为 BDR 目前无法复制迁移中的操作。

在最近与第二象限(BDR 开发的主要赞助商)支持的电子邮件对话中,我收到了有关该主题的以下信息:

交付这个没有时间表。很难完成。

您仍然可以更改列的类型,只需执行多个步骤。通常,您在 BDR 中执行 DDL,就好像您在股票 PostgreSQL 中使用锁避免方法一样。所以在这种情况下,你:

  • 添加没有 DEFAULT 且没有任何 NOT NULL 的新列,然后提交。如果需要,还可以创建一个触发器以在插入值时自动填充新列。或者更改新列以设置默认值,如果这样更合适的话。
  • 更新表以将值复制到具有新类型的新列
  • 如果合适,更改表以使其不为空
  • 删除旧列

我还发现BrainTree的这篇文章对于什么可以被认为是“安全”操作以及如何在迁移中重写行为是一个很好的参考。

于 2015-09-23T20:33:45.780 回答
3

您可以使用MIGRATION_MODULES设置覆盖 auth 应用程序的内置迁移,例如:

MIGRATION_MODULES = {
    'auth': 'bdr_migrations.auth',
}

然后将迁移文件从 django 包复制到 /project/bdr_migrations/auth/ 并调整它们以匹配 BDR 限制。

于 2017-08-24T20:48:40.483 回答