我有一个字典列表,有相同的键(Python内置),我想插入到PSQL数据库中。键名与PSQL数据库的列一致。有人能建议一些有效的方法吗?
xuo3flqw1#
您可以使用.executemany方法。使用psycopg2的示例:
.executemany
psycopg2
cursor.executemany( 'INSERT INTO mytable (field_a, field_b, filed_c) ' 'VALUES (%(field_a)s, %(field_b)s, %(field_c)s)', data )
data可以是您的字典列表。
data
ldioqlga2#
可以在PSQL中使用executemany一次插入多个记录,如下所示:
executemany
conn=psycopg2.connect("dbname='db_name' user='db_user' password='db_pass'") data = [{"col1":"data11", "col2":"data21"}, {"col1":"data12", "col2":"data22"}, {"col1":"data13", "col2":"data23"}] cur = conn.cursor() cur.executemany("""INSERT INTO bar(col1,col2) VALUES (%(col1)s, %(col2)s)""", data)
如果您没有dict结构,则需要确保数据在表中的列顺序正确,如下所示:
dict
cur.executemany( """INSERT INTO bar(col1,col2) VALUES (%s,%s)""", data)
数据格式应为:
data = [['data11', 'data21'], ['data12', 'data22']]
你想这么做吗?告诉我,很有效。
ar5n3qh53#
来自文档:executemany()的当前实现(使用一种极其仁慈的轻描淡写的说法)并不是特别有效。对于每个this线程,您应该使用cursor.copy_from或extras.execute_values,它们执行单个批量插入。
executemany()
cursor.copy_from
extras.execute_values
一米三米一x
data = [{'col1': 1, 'col2': 2}, {'col1': 3, 'col2': 4}, {'col1': 5, 'col2':6}] f = IteratorFile(("{0}\t{1}".format(k['col1'], k['col2']) for k in data.keys())) cursor.copy_from(f, 'table_name', columns=('col1', 'col2'))
请参阅here,了解与cursor.execute相比的基准测试。IteratorFile类可以在here中找到。或者,可以使用StringIO完成更经典的实现。
cursor.execute
IteratorFile
StringIO
data = [{'col1': 1, 'col2': 2}, {'col1': 3, 'col2': 4}, {'col1': 5, 'col2':6}] f = io.StringIO([f"{row['col1']}\t{row['col2']}\n" for row in data]) f.seek(0) cursor.copy_from(f, 'table_name', columns=('col1', 'col2'))
一米七三
data = [{'col1': 1, 'col2': 2}, {'col1': 3, 'col2': 4}, {'col1': 5, 'col2':6}] insert_query = 'insert into table_name (a, b) values %s' psycopg2.extras.execute_values( cursor, insert_query, [tuple(d) for d in data] )
3条答案
按热度按时间xuo3flqw1#
您可以使用
.executemany
方法。使用psycopg2
的示例:data
可以是您的字典列表。ldioqlga2#
可以在PSQL中使用
executemany
一次插入多个记录,如下所示:如果您没有
dict
结构,则需要确保数据在表中的列顺序正确,如下所示:数据格式应为:
你想这么做吗?告诉我,很有效。
ar5n3qh53#
来自文档:
executemany()
的当前实现(使用一种极其仁慈的轻描淡写的说法)并不是特别有效。对于每个this线程,您应该使用
cursor.copy_from
或extras.execute_values
,它们执行单个批量插入。一米三米一x
请参阅here,了解与
cursor.execute
相比的基准测试。IteratorFile
类可以在here中找到。或者,可以使用StringIO
完成更经典的实现。一米七三