这并不完全正确。您可以通过为 to_sql 接受的 kwarg method 提供自己的函数来实现此功能以使用 COPY FROM。 DataFrame.to_sql 的 Pandas 文档中的关键位是 method 不仅可以是字符串,还可以是可调用的。这就是你要提供的
例如:
from csv import (writer as csv_writer, QUOTE_MINIMAL)
from io import StringIO
def some_function(df, connection):
try:
frame.to_sql(
'my_table',
connection,
schema='public',
if_exists='append',
index=False,
method=copy_from_method)
except Exception as err:
print('Got an error ({})'.format(str(err))
然后,您可以像这样实现copy_from_method:
def copy_from_method(table, conn, keys, data_iter, pre_truncate=False, fatal_failure=False):
"Custom method for pandas.DataFrame.to_sql that will use COPY FROM"""
dbapi_conn = conn.connection
cur = dbapi_conn.cursor()
s_buf = StringIO()
writer = csv_writer(s_buf, quoting=QUOTE_MINIMAL)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
table_name = '{}.{}'.format(
table.schema, table.name) if table.schema else table.name
sql_query = 'COPY %s (%s) FROM STDIN WITH CSV' % (table_name, columns)
cur.copy_expert(sql=sql_query, file=s_buf)
return cur.rowcount
示例copy_from_method 显然可能需要一些工作 - 在某些情况下,您需要小心引用和转义 CSV 编写器。但是这个粗略的版本应该工作得比较好,除非有任何拼写错误/复制粘贴错误(这是我在项目中使用的精简版本)