2017-11-17 15 views
1

私のプロジェクトでは、cx_Oracleを使用してOracleデータベースからデータを収集し、cx_Oracleカーソルの結果とモデルを持つSQLiteデータベースのデータを比較する必要があります。cx_oracle cursorの値とdjangoクエリーセットの比較

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) 

しかし、私は実際に何をしたいカーソルから1で私のSQLiteデータベース内の既存のコンテンツをマージすることです:

は、私は以下の行方不明のパラメータを追加するために動作するコードを持っています。既存のパラメータが異なる値で存在する場合は、その値を更新する必要があります。新しいパラメータの場合は、作成する必要があります。これを行う最善の方法は何ですか?私はRAW SQLを使用してMERGEを行う必要がありますか?

ありがとうございました

答えて

0

私は自分の質問に答えます。 これは、両方の新しいパラメータを挿入し、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() 

はUPDATE:

さらに良い:

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 
         ) 
関連する問題