2017-11-17 1 views
1

내 프로젝트에서 cx_Oracle을 사용하여 오라클 데이터베이스에서 데이터를 수집 한 다음 모델이있는 SQLite 데이터베이스의 데이터와 cx_Oracle 커서의 결과를 비교해야합니다.cx_oracle 커서의 값을 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) 

하지만 실제로 수행 할 위치에 커서에서 하나를 내 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 
         ) 
관련 문제