execute_values
วิธีการใหม่ใน Psycopg 2.7:
data = [(1,'x'), (2,'y')]
insert_query = 'insert into t (a, b) values %s'
psycopg2.extras.execute_values (
cursor, insert_query, data, template=None, page_size=100
)
วิธี pythonic ของการทำมันใน Psycopg 2.6:
data = [(1,'x'), (2,'y')]
records_list_template = ','.join(['%s'] * len(data))
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
cursor.execute(insert_query, data)
คำอธิบาย: หากได้รับข้อมูลที่จะถูกแทรกเป็นรายการของสิ่งอันดับเช่น
data = [(1,'x'), (2,'y')]
มันมีอยู่แล้วในรูปแบบที่ต้องการแน่นอนเป็น
values
ไวยากรณ์ของinsert
ประโยคคาดว่ารายการของระเบียนในขณะที่
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
ปรับหลามtuple
กับ record
PostgreSQL
งานที่จำเป็นเท่านั้นคือการจัดทำเทมเพลตรายการบันทึกที่จะเติมโดย psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
และวางไว้ในinsert
แบบสอบถาม
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
การพิมพ์insert_query
ผลลัพธ์
insert into t (a, b) values %s,%s
ตอนนี้การPsycopg
ทดแทนข้อโต้แย้งปกติ
cursor.execute(insert_query, data)
หรือเพียงแค่ทดสอบสิ่งที่จะถูกส่งไปยังเซิร์ฟเวอร์
print (cursor.mogrify(insert_query, data).decode('utf8'))
เอาท์พุท:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
กลยุทธ์ได้ดีขึ้น ฉันเห็นความเร็วประมาณ 100x ด้วยสิ่งนี้!