Python sqlite3使用format拼接INSERT字段名报语法错误如何解决
问题根因
你直接将元组作为参数传入format方法拼接SQL时,会直接把元组的完整字符串表示(包含外层括号、每个元素的单引号)插入到语句中,最终生成的非法SQL结构如下:
INSERT INTO `songs` (('song', 'album', 'artist', 'genre', 'duration', 'price')) VALUES (?,?,?,?,?,?);
字段列表外层多了一层括号,且字段名错误使用了单引号标识,直接触发语法报错。
解决方法
先将header元组处理为逗号分隔的字段名字符串,再进行format拼接,修正后的代码如下:
def insert_song(cursor): header = get_header(cursor) # 给每个字段名包裹反引号避免与SQL关键字冲突,再用逗号拼接 formatted_header = ', '.join(f'`{col}`' for col in header) query = "INSERT INTO `songs` ({}) VALUES (?,?,?,?,?,?);".format(formatted_header) cursor.execute(query, get_info(cursor)) connection.commit()
注意事项
- 若你能确认header返回的字段均为非SQL关键字、命名完全合法,也可以省略反引号直接拼接:
formatted_header = ', '.join(header) - Sqlite3的参数绑定仅支持传入数据值,不支持传入字段名、表名这类SQL结构参数,动态结构部分必须手动拼接,只要header来源可控(非用户直接输入),就不会有SQL注入风险
内容的提问来源于stack exchange,提问作者alpoehi
相关产品推荐
相关产品推荐

