execute_values
Phương pháp mới trong 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
)
Cách làm pythonic trong 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)
Giải thích: Nếu dữ liệu được chèn được đưa ra dưới dạng danh sách các bộ dữ liệu như trong
data = [(1,'x'), (2,'y')]
sau đó nó đã ở định dạng chính xác như
các values
cú pháp của insert
khoản dự đoán một danh sách các hồ sơ như trong
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
điều chỉnh một Python tuple
cho Postgresql record
.
Công việc cần thiết duy nhất là cung cấp một mẫu danh sách hồ sơ được điền bởi psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
và đặt nó trong insert
truy vấn
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
In các insert_query
đầu ra
insert into t (a, b) values %s,%s
Bây giờ để Psycopg
thay thế đối số thông thường
cursor.execute(insert_query, data)
Hoặc chỉ kiểm tra những gì sẽ được gửi đến máy chủ
print (cursor.mogrify(insert_query, data).decode('utf8'))
Đầu ra:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
chiến lược càng tốt. Tôi đã thấy speedup khoảng 100 lần nhờ vào điều này!