与psycopg2 / Python的DB-API和PostgreSQL参数化查询
-
13-09-2019 - |
题
什么是使psycopg2通过参数化查询到PostgreSQL的最佳方式?我不想写我自己的escpaing机制或适配器和psycopg2的源代码和实例都很难在Web浏览器来阅读。
如果我需要切换到像PyGreSQL或其他蟒蛇PG适配器,这是我没意见。我只是想简单的参数。
解决方案
psycopg2
遵循DB-API 2.0的规则(在 PEP-249 )。这意味着你可以从你的execute
对象调用cursor
方法和使用pyformat
结合的风格,它会做转义为您服务。例如,下面的应是安全的(和工作):
cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s",
{"lname": "Robert'); DROP TABLE students;--"})
其他提示
从psycopg文档
( http://initd.org/psycopg/docs/usage.html )
警告切勿,永远,永远使用Python字符串连接(+)或字符串参数插值(%)将变量传递到SQL查询字符串。甚至在枪口。
传递变量在SQL命令的正确的方法是使用execute()方法的第二个参数:
SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
data = ("O'Reilly", )
cur.execute(SQL, data) # Note: no % operator
下面是几个例子你可能会发现有用
cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})
或者您可以动态构建查询基于字段名的字典,值:
fields = ', '.join(my_dict.keys())
values = ', '.join(['%%(%s)s' % x for x in my_dict])
query = 'INSERT INTO some_table (%s) VALUES (%s)' % (fields, values)
cursor.execute(query, my_dict)
请注意:该字段必须在代码中定义的不可以用户输入,否则就会容易受到SQL注入
。不隶属于 StackOverflow