从可迭代中获取一些元素,执行某些操作,更多地使用一些元素,等等

时间:2014-02-18 12:45:20

标签: python itertools

这是一些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 :(得分: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