如何使psycopg2将参数化查询传递给PostgreSQL?我不想编写自己的转义机制或适配器,而且在Web浏览器中阅读psycopg2源代码和示例很困难。
如果需要切换到PyGreSQL或其他Python PG适配器,那对我来说也没问题。我只是想要简单的参数化。
如何使psycopg2将参数化查询传递给PostgreSQL?我不想编写自己的转义机制或适配器,而且在Web浏览器中阅读psycopg2源代码和示例很困难。
如果需要切换到PyGreSQL或其他Python PG适配器,那对我来说也没问题。我只是想要简单的参数化。
psycopg2
遵循 PEP-249 中规定的 DB-API 2.0 规则。这意味着您可以从您的 cursor
对象调用 execute
方法并使用 pyformat
绑定样式,它会为您进行转义。例如,以下内容应该是安全的(并且有效):
cursor.execute("SELECT * FROM students WHERE last_name = %(lname)s",
{"lname": "Robert'); DROP TABLE students;--"})
编辑:tekHedd的评论 正确指出SELECT
和DROP TABLE
使用了不同的表名,所以我已经修复了它。
来自 psycopg 文档
(http://initd.org/psycopg/docs/usage.html)
警告:千万不要使用 Python 字符串拼接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串,甚至在枪口下也不行。
在 SQL 命令中正确传递变量的方式是使用 execute() 方法的第二个参数:
SQL = "INSERT INTO authors (name) VALUES (%s);" # 注意:不要加引号
data = ("O'Reilly", )
cur.execute(SQL, data) # 注意:不要使用 % 操作符
cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})
或者您可以根据字段名称和值的字典动态构建查询:
query = 'INSERT INTO some_table (%s) VALUES (%s)'
cursor.execute(query, (my_dict.keys(), my_dict.values()))
注意:这些字段必须在您的代码中定义,而不是用户输入,否则您将容易受到SQL注入攻击。
psycopg2.extensions.quote_ident
:fields = ','.join(quote_ident(key) for key in my_dict)
,或者更好的方法是:使用 psycopg2.sql
。 - Ali Akbar
set height=5, weight=70
。 - Mutai Mwiti