0

fetchallクエリ結果を新しい SQLite テーブルに挿入するためにPython の方法を使用することは避けたいと思いfetchoneますfetchmany。ただし、カーソルを使用してクエリをループしようとすると、挿入は 1 回のパス内でのみ発生します (この場合、すべてではなく事前定義された 1000 行のみが挿入されます)。ただし、ループ結果を空のリストに追加すると、すべての行が追加されるため、ループ自体が問題であるかのようにはなりません。

次のスクリプトは機能しません。

   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 に答える