Python向MySQL插入字典数据报错及占位符使用疑问求助
解决Python字典插入MySQL的AttributeError及占位符正确用法
问题根源
- 报错直接原因:你调用
value.isdigit()时,若value是整数类型会触发AttributeError——isdigit()是字符串专属方法,整数对象没有这个属性。 - 核心误解:你对MySQL占位符的用法完全搞错了,根本不需要手动区分整数/字符串来添加引号。
占位符正确用法
Python的MySQL驱动(如pymysql、MySQLdb)的参数化查询中,所有数据类型统一用%s作为占位符,驱动会自动处理:
- 字符串类型:自动添加引号并转义特殊字符
- 整数/数值类型:直接传入,无需额外处理
- 同时还能避免SQL注入风险
修正后的代码
def db_insert(table, **data): cursor = db.cursor() # 拼接列名字符串 columns = ', '.join(data.keys()) # 生成对应数量的%s占位符 placeholders = ', '.join(['%s'] * len(data)) # 构造插入SQL语句 sql = f"INSERT INTO {table} ({columns}) VALUES ({placeholders})" # 获取与列名顺序匹配的值列表(Python3.7+字典默认保序) values = list(data.values()) # 执行参数化查询,第二个参数传值列表而非拼接字符串 cursor.execute(sql, values) db.commit() new_id = cursor.lastrowid cursor.close() return new_id # 调用示例 db_insert('table', **dict_data)
关键优化点
- 移除了冗余的类型判断逻辑,所有占位符统一用
%s cursor.execute()的第二个参数必须传值序列(列表/元组),不能传拼接后的字符串,否则会失去参数化查询的安全特性- 利用Python3.7+字典的保序特性,直接通过
data.values()获取对应顺序的值,无需额外循环保证匹配
内容的提问来源于stack exchange,提问作者Topher76
相关产品推荐
相关产品推荐

