我想将大约 500k 的记录从一张表复制到另一张表。要指定我只想从行中复制一列。
我当然不想在一个大的插入语句中执行此操作,所以我想知道如何使用批量插入来执行此操作,问题是我不确定我是否正确理解了 batch_insert 在这里的工作方式。我想要实现的是将 1000 行的一部分插入到另一个表中。
这是我的方法:
#!/usr/bin/python
import psycopg2
import psycopg2.extras
from config import config
def connect():
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
with conn.cursor() as cur:
cur.execute("select id from old_table where id like '%test%'")
results = cur.fetchall()
sql = "insert into new_table select id from old_table where id like '%test%'"
with conn.cursor() as cur:
data_gen = ((rIdx, cIdx, value) for rIdx, cData in enumerate(results) for cIdx, value in enumerate(cData))
psycopg2.extras.execute_batch(cur, sql, data_gen, page_size=1000*len(results[0]))
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
有人可以告诉我,如果我做对了,这将批量插入 1000 行,直到所选产品列表的末尾?
编辑: 我可以看到在 execute_batch 到我的新表之后,我没有插入指定数量的记录,而是插入了更多重复项。为什么? :( 我在较小的示例中尝试插入 248 条记录,但在新表中有 1,783,616 条新记录,而不是 248 条,这对我来说是完全无法理解的。我做错了什么? 我计算出 1,783,616 是 248 * 248 * size_of_record (29)。
感谢您的帮助。