如何为PostreSQL和sqlite3编写psycopg2的SQL语句?

时间:2016-06-24 15:37:00

标签: python postgresql sqlite

我在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')

这是一种丑陋的黑客攻击,但我不想写两次所有查询,那么这个问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:3)

使用简单的?%s字符串替换是危险的,您可能会以各种不可预测的方式破坏查询或损坏实际数据,这可能很难调试。

查看“SQL for human”records package,它为所有受支持的数据库提供统一的参数化样式。

请注意records只能使用SQLAlchemy包中的text() function来实现与数据库无关的参数化样式。您也可以直接使用它:

  

text()在普通字符串上提供的优势是后端中立的   支持绑定参数,每个语句执行选项   作为绑定参数和结果列键入行为,允许   SQLAlchemy类型构造在执行语句时发挥作用   这是字面上指定的。