如果你只是想根据 pandas.DataFrame
生成一个带插入的字符串,我建议使用 @rup 建议的批量 SQL 插入语法。
以下是我为此编写的示例 函数:
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
参数)。
通常,它的工作速度更快,因为任何数据库都会为单个插入执行大量的工作:检查约束、构建索引、刷新、写入日志等。当进行多个操作时,可以通过数据库优化这些复杂的操作,而不是逐个调用引擎。