Django 2个数据库如何做数据同步

A数据库 A model 为已有的数据表视图生成,只查询数据 (现使用软件会更新里面的数据)
B数据库 B model 继承A model 没有数据 同时有几个自己写的字段,如何让B model 与A model 的数据同步呢

参考GPT和自己的思路:对于这个问题,我们可以考虑使用 Django 的数据库路由来实现两个数据库之间的数据同步。具体操作如下:

  1. 在 settings.py 文件中配置数据库信息,包括 A 和 B 数据库的信息。

  2. 创建一个数据库路由类(比如叫做 SyncRouter),该类继承自 django.db.router.Router。

  3. 在 SyncRouter 类中实现 db_for_read 和 db_for_write 方法,根据需要指定不同的数据库。

  4. 在 B model 中指定数据库路由为 SyncRouter。

这样配置之后,当你在 B 数据库创建新的数据时,会自动将 A 数据库中的数据同步到 B 数据库中。具体实现方法可以参考 Django 官方文档中的 Database Routers 部分:https://docs.djangoproject.com/en/3.1/topics/db/multi-db/#database-routers。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

如果您的B数据库是用于新增数据而不是修改已有数据,可以考虑使用Django的数据库路由(database routing)机制,指定在写操作(如新增、修改、删除)时使用B数据库,读操作时使用A数据库。这样A数据库中的数据就会被同步到B数据库中。

以下是一种可能的实现方法:

首先,在settings.py文件中添加一个数据库配置为B数据库,例如:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'A_database',
        'USER': 'dbuser',
        'PASSWORD': 'dbpass',
        'HOST': 'localhost',
        'PORT': '',
    },
    'B_database': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'B_database',
        'USER': 'dbuser',
        'PASSWORD': 'dbpass',
        'HOST': 'localhost',
        'PORT': '',
    }
}

然后,在settings.py文件中定义一个数据库路由类,用于指定在写操作时使用B数据库,读操作时使用A数据库。例如:

class BDatabaseRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'default'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'B_database'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'myapp':
            return db == 'B_database'
        return None

在上述代码中,我们定义了一个名为BDatabaseRouter的数据库路由类,并通过db_for_readdb_for_write方法指定在读操作时使用A数据库,在写操作时使用B数据库。其中,myapp是您的应用程序名称。

最后,在settings.py文件中将上述数据库路由配置添加到DATABASE_ROUTERS列表中,例如:

DATABASE_ROUTERS = ['path.to.BDatabaseRouter']

接下来,您可以创建一个继承自A model的B model并增加字段,如下所示:

from django.db import models
from myapp.models import AModel

class BModel(AModel):
    new_field = models.CharField(max_length=255, blank=True, null=True)

在上述代码中,我们创建了一个名为BModel的模型,继承自AModel模型,并增加了一个新字段new_field

现在,您可以使用Django的ORM操作来同步数据。例如,可以执行以下代码将A数据库中的所有数据复制到B数据库中:

from myapp.models import AModel
from myapp.models import BModel

for a_obj in AModel.objects.all():
    b_obj = BModel()
    for field in a_obj._meta.fields:
        setattr(b_obj, field.name, getattr(a_obj, field.name))
    b_obj.save()

在上述代码中,我们遍历A数据库中的所有对象,并将其属性值复制到B数据库中的新对象中,然后保存到B数据库中。请注意,这种同步方式只能用于新增数据,不能修改已有的数据。

希望以上解答可以对您有所帮助。