如何动态将DataFrame行值填充到字符串生成SQL插入语句?
问题解决方法
核心问题分析
- 模板未解析:你的
row_values是普通字符串,没有针对每个row动态求值,只是原样输出了模板内容。 - 语句拼接错误:循环中
insert_stmt += f"{insert_stmt}..."会导致每次重复拼接整个之前的语句,生成错误的SQL。
修正后的代码
import pandas as pd # 基础INSERT语句模板 insert_base = "INSERT INTO mytable(col1, col2) VALUES ({})" # 从数据库获取的行值规则模板(模拟) row_values = "'{row.col1}', {NULL if row.col2 in [pd.NaT, None, ''] else repr(row.col2)}" data = {'col1': [1, 2, 3], 'col2': ['a', None, 'c'], 'col3': [4.5, 6.7, 'd']} df = pd.DataFrame(data) # 遍历DataFrame的每一行 for row in df.itertuples(index=False): # 动态解析行值模板:通过eval执行f-string格式化 parsed_values = eval(f"f\"{row_values}\"", {"row": row, "pd": pd}) # 生成完整的INSERT语句 insert_stmt = insert_base.format(parsed_values) print(insert_stmt)
关键调整说明
- 拆分语句模板:将固定的INSERT前缀和动态的行值部分分离,避免循环中重复拼接错误。
- 动态解析模板:用
eval(f"f\"{row_values}\"")实现对字符串模板的动态f-string解析,把当前行row和pd(用于判断NaT)作为上下文变量传入,让模板中的表达式能正确求值。 - 自动处理引号:用
repr()函数自动处理字符串类型的引号,同时保证NULL值输出符合SQL语法(无需引号)。 - 去掉索引列:
itertuples(index=False)避免遍历到DataFrame的索引属性,只处理数据列。
输出结果
运行后会生成正确的单条INSERT语句:
INSERT INTO mytable(col1, col2) VALUES ('1', 'a') INSERT INTO mytable(col1, col2) VALUES ('2', NULL) INSERT INTO mytable(col1, col2) VALUES ('3', 'c')
内容的提问来源于stack exchange,提问作者pymach
相关产品推荐
相关产品推荐

