2014-02-18 3 views
1
여기

다른 서버에서 다른 데이터베이스에 하나 개의 서버에 하나의 데이터베이스에서 데이터를 이동하는 일부 파이썬 코드 :몇 가지 더 많은 요소를 가지고, 무언가를, 반복 가능에서 몇 가지 요소를 가지고 등

cursor1.execute(""" 
     SELECT d1.Doc_Id , d2.Doc_Id 
     FROM Document d1 
     INNER JOIN Reference r ON d1.Doc_Id = r.Doc_Id 
     INNER JOIN Document d2 ON r.R9 = d2.T9 
""") 

cursor2.execute("START TRANSACTION") 
cursor2.executemany("INSERT IGNORE INTO citation_t(citing_doc_id, cited_doc_id) VALUES (?,?)", 
    cursor1) 
cursor2.execute("COMMIT") 

이제 박람회를 위해 트랜잭션이 커밋 전에 대상 하드 드라이브의 공간을 다 써 버리면 커밋이 손실된다고 가정 해 봅시다. 하지만 성능 측면에서 원 자성이 아닌 트랜잭션을 사용하고 있습니다. 따라서 커밋 된 데이터로 하드 드라이브를 채우고 전체적으로 유지하고 상사에게 보여줄 수 있습니다. 다시 말하지만, 이것은 해설을위한 것입니다. 실제 질문은 아래에 있습니다. 이 시나리오에서는 차라리 할 것 :

cursor1.execute(""" 
     SELECT d1.Doc_Id , d2.Doc_Id 
     FROM Document d1 
     INNER JOIN Reference r ON d1.Doc_Id = r.Doc_Id 
     INNER JOIN Document d2 ON r.R9 = d2.T9 
""") 

MAX_ELEMENTS_TO_MOVE_TOGETHER = 1000 

dark_spawn = some_dark_magic_with_iterable(cursor1, MAX_ELEMENTS_TO_MOVE_TOGETHER) 

for partial_iterable in dark_spawn: 
    cursor2.execute("START TRANSACTION") 
    cursor2.executemany("INSERT IGNORE INTO citation_t(citing_doc_id, cited_doc_id) VALUES (?,?)", 
      partial_iterable) 

    cursor2.execute("COMMIT") 

내 질문이 some_dark_magic_with_iterable에 작성의 올바른 방법 인 것입니다, 즉, 그 사이 일시 정지와 반복자의 일종을 만들?

+1

... 좋아 ... 일반 반복자를 들어, 좋아? –

+0

@MartijnPieters 예, 일종의 ... – dsign

답변

2

발전기를 만드십시오! : P

def some_dark_magic_with_iterable(curs, nelems): 
    res = curs.fetchmany(nelems) 
    while res: 
     yield res 
     res = curs.fetchmany(nelems) 

당신은 * 배치 * 결과에 원하는 의미

def some_dark_magic_with_iterable(iterable, nelems): 
    try: 
     while True: 
      res = [] 
      while len(res) < nelems: 
       res.append(iterable.next()) 
      yield res 
    except StopIteration: 
     if res: 
      yield res 
+0

안녕하세요! 너는 속이고있다! 일반 이터레이터에는 'fetchmany'가 없습니다. 그러나이 경우에는 귀하의 대답이 도움이 될 것입니다. – dsign

+0

일반 이터레이터는 그렇지 않을 수 있지만 SQL을 쿼리하면 커서가 있어야합니다. –

+0

Super-thanks. 나는 너의 대답을 지금 받아들이고있다. 그것은 표준 라이브러리에 어딘가에 하나의 라이너가없는 것이 유감입니다 ... – dsign