如果您只是想根据pandas.DataFrame 生成带有插入的字符串 - 我建议您使用 @rup 建议的批量 sql 插入语法。
以下是我为此目的编写的function 示例:
import pandas as pd
import re
def df_to_sql_bulk_insert(df: pd.DataFrame, table: str, **kwargs) -> str:
"""Converts DataFrame to bulk INSERT sql query
>>> data = [(1, "_suffixnan", 1), (2, "Noneprefix", 0), (3, "fooNULLbar", 1, 2.34)]
>>> df = pd.DataFrame(data, columns=["id", "name", "is_deleted", "balance"])
>>> df
id name is_deleted balance
0 1 _suffixnan 1 NaN
1 2 Noneprefix 0 NaN
2 3 fooNULLbar 1 2.34
>>> query = df_to_sql_bulk_insert(df, "users", status="APPROVED", address=None)
>>> print(query)
INSERT INTO users (id, name, is_deleted, balance, status, address)
VALUES (1, '_suffixnan', 1, NULL, 'APPROVED', NULL),
(2, 'Noneprefix', 0, NULL, 'APPROVED', NULL),
(3, 'fooNULLbar', 1, 2.34, 'APPROVED', NULL);
"""
df = df.copy().assign(**kwargs)
columns = ", ".join(df.columns)
tuples = map(str, df.itertuples(index=False, name=None))
values = re.sub(r"(?<=\W)(nan|None)(?=\W)", "NULL", (",\n" + " " * 7).join(tuples))
return f"INSERT INTO {table} ({columns})\nVALUES {values};"
顺便说一句,它将nan/None 条目转换为NULL,并且可以将常量列=值对作为关键字参数传递(请参阅文档字符串示例中的status="APPROVED" 和address=None 参数)。
一般来说,它的工作速度更快,因为任何数据库都为单个插入执行大量工作:检查约束、构建索引、刷新、写入日志等。数据库可以在执行多次插入时优化这种复杂的操作-one 操作,而不是一个一个地调用引擎。