You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django模型CompanyInfo的输入同步至另一数据库实现数据备份?

Django跨库同步模型数据实现备份

1. 配置备份数据库

在项目settings.py中添加第二个数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'backup_db': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'backup_db.sqlite3',
    }
}

根据实际使用的数据库替换ENGINE(如MySQL用django.db.backends.mysql)。

2. 创建备份模型

在对应app的models.py中创建与CompanyInfo结构完全一致的备份模型:

class BackupCompanyInfo(models.Model):
    company_name = models.CharField("Company Name", unique=True, max_length=50, default="")
    identifier = models.IntegerField(default=0)
    sector = models.CharField("Sector", max_length=50,default="")
    location = models.CharField("Location", max_length=100, default="")
    year_founded = models.IntegerField("Year Founded", default=2000)
    company_description = models.TextField("Company Description", default="")
    state_registered_in = models.CharField("State of Registration", choices=states_list, max_length=2, default=2)
    company_url = models.URLField("Company URL", max_length=200, default="", blank=True, null=True)
    phone_number = models.CharField("Phone Number", max_length=20,default="")
    company_logo_url = models.ImageField("Company Logo", upload_to=None, height_field=None, width_field=None, max_length=100, blank=True, null=True)
    facebook = models.URLField("Facebook URL", max_length=200, default="", blank=True, null=True)
    linkedin = models.URLField("Linkedin URL", max_length=200, default="", blank=True, null=True)
    instagram = models.URLField("Instagram URL", max_length=200, default="", blank=True, null=True)
    email = models.EmailField("Email Address", max_length=40,default="")

    def __str__(self):
        return "{} from {}".format(self.company_name, self.location)

执行迁移命令初始化备份数据库表:

python manage.py makemigrations
python manage.py migrate --database=backup_db

3. 用信号实现自动同步

在app目录下创建signals.py,编写同步逻辑:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import CompanyInfo, BackupCompanyInfo

@receiver(post_save, sender=CompanyInfo)
def sync_to_backup(sender, instance, created, **kwargs):
    # 提取实例字段数据(排除自增ID)
    field_data = {
        field.name: getattr(instance, field.name)
        for field in CompanyInfo._meta.fields
        if field.name not in ('id',)
    }

    if created:
        BackupCompanyInfo.objects.using('backup_db').create(**field_data)
    else:
        # 基于唯一字段company_name更新备份数据
        BackupCompanyInfo.objects.using('backup_db').filter(company_name=instance.company_name).update(**field_data)

在app的apps.py中注册信号:

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app_name'

    def ready(self):
        import your_app_name.signals

确保settings.py的INSTALLED_APPS中使用该配置类:

INSTALLED_APPS = [
    # ...
    'your_app_name.apps.YourAppConfig',
    # ...
]

验证与注意事项

  • 新增/更新CompanyInfo数据时,备份库的BackupCompanyInfo会自动同步
  • 删除原库数据,备份库数据不受影响,满足需求
  • 若涉及文件字段(如company_logo_url),需确保备份环境能访问到文件存储路径,或额外处理文件同步
  • 可添加异常捕获逻辑,避免同步失败阻塞主流程

内容的提问来源于stack exchange,提问作者evan2160

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:18:26