首页 > 解决方案 > Django 中的 save() 函数会覆盖数据库表中的旧数据吗?

问题描述

我正在开发一个适用于两个数据库的 Django 应用程序,如下所示:

  1. Oracle DB(按小时获取数据)
  2. MySql DB(保存从 Oracle DB 获取的已处理数据)

我在 settings.py 中的数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dashboard',
        'USER': 'db1',
        'PASSWORD': 'password1',
        'HOST': 'localhost',
        'PORT': '3306',
    },

    'MBDB': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'db2',
        'PASSWORD': 'password2',
        'HOST': 'localhost',
        'PORT': '1521',
    }
}

我的 Django 模型:

class Transactions(models.Model):
    class Meta:
        db_table='TRANSACTIONS'
        unique_together=(("TIME_UPDATED","TRAN_TYPE"),)
        indexes=[
        models.Index(fields=["TIME_UPDATED","TRAN_TYPE"]),
        models.Index(fields=["TRAN_TYPE"])
        ]
    TIME_UPDATED            =   models.DateTimeField()
    TRAN_TYPE               =   models.CharField(max_length=32,primary_key=True)
    SUCCESS                 =   models.IntegerField()
    TECHNICAL_DECLINES      =   models.IntegerField()
    BUSINESS_DECLINES       =   models.IntegerField()
    TOTAL                   =   models.IntegerField()
    PERCENTAGE_TECH_DEC     =   models.FloatField()
    def __str__(self):
        return self.TRAN_TYPE
    def save(self,D,tran):
        self.TIME_UPDATED=D
        self.TRAN_TYPE=T=tran['Type']
        self.SUCCESS=S=int(tran['Success'])
        self.TECHNICAL_DECLINES=TD=int(tran['Tech_dec'])
        self.BUSINESS_DECLINES=BD=int(tran['Bus_dec'])
        self.TOTAL=total=S+TD+BD
        if total==0:#division by zero error constraint
            self.PERCENTAGE_TECH_DEC=0
        else:
            self.PERCENTAGE_TECH_DEC=((TD/(total))*100)
        super(Transactions,self).save()
   Here the column ```TRAN_TYPE`` is defined as the primary key and both ```TRAN_TYPE``` AND ```TIME_UPDATED``` are composite primary keys as defined in ```Class Meta```.

来自views.py 的示例查询集:

{'SERVICE_CODE': 'IBKREVERSAL', 'Type': 'IBKREVERSAL', 'Success': 1, 'Tech_dec': 4, 'Bus_dec': 0}

查询集已处理并保存@Transactions 于 2021 年 10 月 14 日 - 17:25:20:

{'TIME_UPDATED': datetime.datetime(2021, 10, 14, 17, 25, 20, tzinfo=<UTC>), 'TRAN_TYPE': 'IBKREVERSAL', 'SUCCESS': 1, 'TECHNICAL_DECLINES': 4, 'BUSINESS_DECLINES': 0, 'TOTAL': 5, 'PERCENTAGE_TECH_DEC': Decimal('80.000')}

现在,当我尝试在不同的时间(例如 2021 年 10 月 14 日 - 17:27:00)处理和保存相同的查询集时,之前的数据将被覆盖,这在我试图保存时不应该发生记录形式的数据。

我该怎么办?

标签: mysqldjango

解决方案


推荐阅读