postgres批量操作高性能写法
一、背景
多次循环excute、execute_batch和execute_values为postgres三种批量操作方式,经调研,其中execute_values为性能最佳实践。
二、方法详解
execute_values(cur, sql, argslist, template=None, page_size=100, fetch=False)
使用具有一系列参数的VALUES执行语句。
cur:用于执行查询的光标。
sql:要执行的查询。它必须包含一个%s占位符,该占位符将被值列表替换。示例:“插入mytable(id,f1,f2)值%s”。
argslist:序列或字典序列,其中包含要发送给查询的参数。类型和内容必须与template一致。
template:要合并到argslist中的每个项目以构成查询的代码段。如果argslist项是序列,则它应该包含位置占位符(例如,(%s,%s,%s,%s)”,或“(%s,%s,42)”如果存在常量值…)。如果argslist项是映射,则它应该包含命名占位符(例如“(%id)s、%(f1)s、42)”。如果未指定,则假设参数是序列,并使用简单的位置模板(即(%s,%s,…)并使用argslist中第一个元素嗅探的占位符数量。
page_size:每个语句中包含的argslist项的最大数量。如果有更多项,函数将执行多个语句。
fetch:如果为True,则将查询结果返回到列表中(如在fetchall()中)。对于带有返回子句的查询有用。
三、代码示例
import psycopg2.extras
pg_conn = psycopg2.connect(database="postgres", user="postgres", password="xxxxxxx", host="10.255.xx.xxx", port="5432")
cursor = pg_conn.cursor()
values = [('ID_1', 15, '吉林省', '2000-10-01'), ('ID_2', 20, '北京市', '2010-03-01')]
psycopg2.extras.execute_values(
cursor, sql="""update table_test set age=tmp.age,birth_place=tmp.birth_place,\
birthday=tmp.birthday from (values %s) as tmp (id, age,birth_place,birthday) \
where table_test.id= tmp.id""", argslist=values, page_size=1)
pg_conn.commit()
cursor.close()
pg_conn.close()