从SQLite切换为pymysql后SQL查询生成函数报错如何解决?
问题产生原因
- 核心差异是SQLite与PyMySQL使用的参数占位符规范不同:
- SQLite的Python驱动采用
?作为位置参数的占位符 - PyMySQL遵循Python DB API规范,采用
%s作为预编译语句的参数占位符
- SQLite的Python驱动采用
- 原有代码生成的SQL语句中使用
?作为占位符,PyMySQL无法识别该格式的占位符,内部执行时会用%操作符把转义后的参数替换到SQL中,此时占位符数量和参数数量不匹配,就抛出了参数未全部完成格式化的报错。
修复方案
仅需要修改update_format_with_args函数中生成占位符的逻辑,将?替换为%s即可,修改后的完整代码如下:
def update_format_with_args(sql, parameters: dict): # 把原有的?占位符替换为pymysql兼容的%s values = ", ".join([ f"{item} = %s" for item in parameters ]) sql = sql.replace("XXX", values) return sql, tuple(parameters.values()) def update_settingsx(**kwargs): with connection.cursor() as db: sql = f"UPDATE main_settings SET XXX " sql, parameters = update_format_with_args(sql, kwargs) db.execute(sql, parameters) db.commit()
注意:如果项目中还有其他适配SQLite生成的带
?占位符的SQL语句,也需要统一替换为%s才能在PyMySQL中正常运行。
内容的提问来源于stack exchange,提问作者Crowd
相关产品推荐
相关产品推荐

