0

我想避免使用 Python 的方法将查询结果插入到新的 SQLite 表中,因为我遇到了使用或fetchall可能会避免的内存问题。但是,当我尝试使用游标遍历查询时,插入只发生在一次传递中(在这种情况下,只插入预定义的 1000 行而不是全部)。但是,将循环结果附加到一个空列表中会导致所有行都被附加,因此问题并不是循环本身。fetchonefetchmany

以下脚本不起作用:

   def fetchsome(cursor, some=1000):
       fetch = cursor.fetchmany
       while True:
           rows = fetch(some)
           if not rows: break
           for row in rows:
               cursor.execute("insert into zip4_upd values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", row)
       conn.commit()

   cur = conn.cursor()
   cur.execute("""select * from zip4 left outer join alias on zip4.primarykey = alias.primarykey left outer join detail on zip4.citystatekey = detail.detail_citystatekey""")
   fetchsome(cur)
4

1 回答 1

3

这听起来像是一份工作executemany

cursor.executemany('''insert into zip4_upd values(
    ?,?,?,?,?,?,?,?,?,?,?,
    ?,?,?,?,?,?,?,?,?,?,?,
    ?,?,?,?,?,?,?,?,?,?,?,
    ?,?,?,?,?,?,?,?,?,?,?,
    ?,?,?,?,?,?,?,?,?,?,?,
    ?,?,?,?,?,?,?,?,?,?,?,?)''', row_gen(cursor))

相反,让每一行row_gen成为一个生成器。yields这是懒惰的,应该是内存效率的。

我对你的代码有点模糊,但这样的东西应该是你的row_gen

def row_gen(cursor, some=1000):
    fetch = cursor.fetchmany
    while True:
        rows = fetch(some)
        if not rows: break
        for row in rows:
            yield row

假设我正确理解了代码,您需要在调用row_gen中正确executemany调用,所以它以... row_gen(cursor)

于 2013-07-08T19:28:18.613 回答