2014-02-18 80 views
1

下面是一些Python代碼從一個數據庫在一個服務器中,另一個服務器將數據移動到另一個數據庫:需要幾個元素從一個迭代,做一些事情,採取一些元素較多,等等

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

超級感謝。我現在接受你的回答。很遺憾,標準庫中沒有任何一行代碼...... – dsign

相關問題