我在python中为我的生产环境使用psycopg2库用于PostgreSQL,但我想用sqlite3库测试我的代码。问题是psycopg2使用%s
作为参数替换的占位符,而sqlite3使用?
。
我对我现在获得的代码不满意,看起来像这样:
queries = {
'is_admin': "SELECT * FROM admins WHERE user_id = ?;",
}
if dbtype == 'postgres':
for key, value in queries.items():
queries[key] = value.replace('?', '%s')
这是一种丑陋的黑客攻击,但我不想写两次所有查询,那么这个问题的最佳解决方案是什么?
答案 0 :(得分:3)
使用简单的?
到%s
字符串替换是危险的,您可能会以各种不可预测的方式破坏查询或损坏实际数据,这可能很难调试。
查看“SQL for human”records
package,它为所有受支持的数据库提供统一的参数化样式。
请注意records
只能使用SQLAlchemy
包中的text()
function来实现与数据库无关的参数化样式。您也可以直接使用它:
text()
在普通字符串上提供的优势是后端中立的 支持绑定参数,每个语句执行选项 作为绑定参数和结果列键入行为,允许 SQLAlchemy类型构造在执行语句时发挥作用 这是字面上指定的。