在Python中为psycopg2中的execute()指定参数时,像这样:
cursor.execute('SELECT * FROM %s', ("my_table", ))
我收到这个错误:
psycopg2.ProgrammingError: syntax error at or near "'my_table'"
LINE 1: SELECT * FROM 'my_table'
我做错了什么?看起来 psycopg2 正在向查询添加单引号,而这些单引号导致了语法错误。
如果我不使用参数,它会正常工作:
cursor.execute('SELECT * FROM my_table')
最佳答案
我相信像这样的参数化语句应该与值一起使用,而不是表名(或 SQL 关键字等)。所以你基本上不走运。
但是请不要担心,因为此机制旨在防止 SQL 注入(inject),并且您通常在编写代码时就知道要访问的表,因此很少有人可能会注入(inject)恶意代码。只需继续将表格写入字符串即可。
如果出于某些(可能是不正当的)原因,您将表名保持为参数化:
- 如果表名来自您的程序(例如字典或类属性),则执行通常的字符串替换。
- 如果表名来自外部世界(想想“用户输入”):要么不这样做,要么完全信任用户并应用之前的方法 1。
例如:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:此时将第三个 %s 替换为另一个 '%s',以允许 psycopg2 稍后处理
#2
:这是将由 psycopg2 正确引用并放置在原始字符串中代替第三个 '%s' 的字符串
关于python - 为什么带有 SQL 查询参数的 psycopg2 cursor.execute() 会导致语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354392/