Новий 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
)
Пітонічний спосіб зробити це в 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
адаптує Python tuple
до Postgresql record
.
Єдина необхідна робота - це надання шаблону списку записів, який заповнюється 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
стратегію. Завдяки цьому я побачив швидкість близько 100 разів!