Điều này không hoàn toàn đúng. Bạn có thể triển khai điều này để sử dụng COPY FROM
bằng cách cung cấp chức năng của riêng bạn cho phương thức kwarg method
to_sql
đó chấp nhận. Bit quan trọng trong tài liệu Pandas cho DataFrame .to_sql
là nơi method
có thể không chỉ là một chuỗi, mà còn có thể gọi. Đó là những gì bạn sẽ cung cấp
Ví dụ:
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))
Sau đó, bạn có thể triển khai copy_from_method
như một cái gì đó như thế này:
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
Ví dụ copy_from_method
có thể sử dụng một số công việc rõ ràng- và bạn sẽ cần phải cẩn thận với việc trích dẫn và thoát với trình viết CSV trong một số trường hợp. Nhưng phiên bản thô này sẽ hoạt động tương đối tốt, loại bỏ mọi lỗi đánh máy / sao chép dán (đây là phiên bản rút gọn mà tôi sử dụng trong một dự án)