【问题标题】:Compare values from cx_oracle cursor with django queryset将 cx_oracle 游标中的值与 django 查询集进行比较
【发布时间】:2018-05-01 00:49:36
【问题描述】:

在我的项目中,我使用 cx_Oracle 从 oracle 数据库收集数据,然后我需要将 cx_Oracle 游标的结果与我有模型的 SQLite 数据库中的数据进行比较。

我有以下代码可用于添加缺少的参数:

    def GetParams(self):
    repo_params = Parameters.objects.filter(dbid=self.dbid).only('name','value')
    sql = ("select name, value from v$parameter")
    self.cur.execute(sql)
    res = self.cur.fetchall()
    repo_params = list(repo_params)
    parameters = []
    for i in res:
        if i[1] not in repo_params:
            new_param = Parameters(name=i[1],value=i[2])
            parameters.append(new_param)
    if len(parameters) > 0:
        Parameters.objects.bulk_create(parameters)

但我真正想做的是将我的 SQLite 数据库中的现有内容与光标中的内容合并。如果存在具有不同值的现有参数,那么我需要更新其值。如果是新参数,则需要创建。做这个的最好方式是什么?我应该使用 RAW sql 进行 MERGE 吗?

谢谢

【问题讨论】:

    标签: django django-queryset cx-oracle


    【解决方案1】:

    我回答我自己的问题。 这是在 SQLite 中处理插入新参数和更新现有参数的简化方法:

        from django.db import connection
    
        def GetParams(self):
        sql = ("select name, value from v$parameter")
        self.cur.execute(sql)
        res = self.cur.fetchall()
        cursor = connection.cursor()
        for i in res:
            cursor.execute('''INSERT OR REPLACE
                              INTO Parameters(dbid, name, value)
                              VALUES( %s, %s, %s)''',[self.dbid,i[0],i[1]]
                          )
        connection.commit()
    

    更新:

    更好:

     def GetParams(self):
        sql = ("select :dbid, name, value from v$parameter")
        named_params = {'dbid': self.dbid}
        self.cur.execute(sql, named_params)
        res = self.cur.fetchall()
        cursor = connection.cursor()
        cursor.executemany('INSERT OR REPLACE\n'
                           'INTO Parameters(dbid, name, value)\n'
                           'VALUES( ?, ?, ?)', res
                           )
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2020-12-27
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多