Nuovo execute_values
metodo in 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
)
Il modo pitonico di farlo in 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)
Spiegazione: Se i dati da inserire sono dati come un elenco di tuple come in
data = [(1,'x'), (2,'y')]
allora è già nel formato esatto richiesto come
la values
sintassi della insert
clausola prevede un elenco di record come in
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
adatta un Python tuple
a un Postgresql record
.
L'unico lavoro necessario è fornire un modello di elenco di record che deve essere compilato da psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
e inseriscilo nella insert
query
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
Stampa delle insert_query
uscite
insert into t (a, b) values %s,%s
Ora alla solita Psycopg
sostituzione degli argomenti
cursor.execute(insert_query, data)
O semplicemente testando ciò che verrà inviato al server
print (cursor.mogrify(insert_query, data).decode('utf8'))
Produzione:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
strategia. Ho visto una velocità di circa 100 volte grazie a questo!