Nowa execute_values
metoda w 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
)
Pythonowy sposób na zrobienie tego w 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)
Objaśnienie: Jeśli dane do wstawienia są podane jako lista krotek, jak w
data = [(1,'x'), (2,'y')]
to jest już w dokładnie wymaganym formacie, jak
values
składnia insert
klauzuli spodziewa listę rekordów, jak w
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
dostosowuje Pythona tuple
do Postgresql record
.
Jedyną konieczną pracą jest dostarczenie szablonu listy rekordów do wypełnienia przez psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
i umieść go w insert
zapytaniu
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
Drukowanie insert_query
wyników
insert into t (a, b) values %s,%s
Teraz do zwykłego Psycopg
podstawiania argumentów
cursor.execute(insert_query, data)
Lub po prostu testowanie tego, co zostanie wysłane na serwer
print (cursor.mogrify(insert_query, data).decode('utf8'))
Wynik:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
strategii. Dzięki temu zauważyłem przyspieszenie około 100x!