什么是使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注入

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top