【发布时间】:2021-11-22 09:10:21
【问题描述】:
我在我的 django 项目中配置了多个数据库之间的 postgres 逻辑复制,以将 django_content_types、cmets 等常见数据从主数据库复制到外围数据库。但是,没有主 DB 或从 DB,因为来自外围 DB 的数据也会复制到主 DB 中。我称它为主要是因为我有一些基本数据。 而且我使用 django-viewflow 应用程序,因此 viewflow 应用程序的实例是从主数据库中读取的。但是我有从 django-viewflow 的模型继承的模型,它们是从外围数据库中读取的。系统如下:
class Process(models.Model): # django-viewflow model, read from primary
class SomeProcess(Process): # inherited model, read and written into another DB
还有一个名为 Task 的模型,它有一个要处理的外键和一个名为“previous”的自引用字段,还有一个名为 viewflow_task_previous 的表,它的 task_id 如下:
class Task(models.Model):
process = models.ForeignKey(Process, on_delete=models.CASCADE, verbose_name=_('Process'))
previous = models.ManyToManyField('self', symmetrical=False, related_name='leading',
verbose_name=_('Previous'))
我自然使用 django 路由器。 所以问题是,当在外围数据库中创建任务对象时,它被复制到主数据库,但 viewflow_task_previous 表只从主数据库读取,所以有时任务数据没有及时复制到主数据库,并且 IntegrityError 出现消息:
insert or update on table "viewflow_task_previous" violates foreign key constraint "viewflow_task_previous_to_task_id_fk_viewflow_task_id"
DETAIL: Key (to_task_id)=(some id) is not present in table "viewflow_task".
这种情况很少发生,但确实会发生。有什么办法可以预防吗?
【问题讨论】:
-
您的意思是 viewflow_task_previous 表被写入到主数据库吗?
-
是的,我忘了提。从peripheral只有viewflow_task和viewflow_process被复制到primary,viewflow_task_previous是从primary db写入和读取,它不会被复制到peripheral。
-
如果您在外围数据库上读写直通表
viewflow_task_previous会解决您的问题吗? -
viewflow_task_previous 仅写入主数据库,因为它是 viewflow 的模型。当我第一次配置逻辑复制时,我将 viewflow_task_previous 添加到主数据库上的发布。但我发现这毫无意义。现在 viewflow_task_previous 表在外围数据库中根本没有记录。
-
viewflow_task 被写入外围设备,并且它是 viewflow_task_previous 也有关系的唯一其他表,它不也是一个 viewflow 模型吗?将它们写入不同的数据库似乎有点奇怪
标签: django postgresql