Новый 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.
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 раз!