Rob*_*ark 6 python sql postgresql psycopg2
在Python中使用psycopg2中的execute()指定参数时,如下所示:
cursor.execute('SELECT * FROM %s', ("my_table", ))
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
psycopg2.ProgrammingError: syntax error at or near "'my_table'"
LINE 1: SELECT * FROM 'my_table'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?看起来psycopg2正在向查询添加单引号,这些单引号导致语法错误.
如果我不使用参数,它可以正常工作:
cursor.execute('SELECT * FROM my_table')
Run Code Online (Sandbox Code Playgroud)
Irf*_*rfy 15
我相信像这样的参数化语句意味着与值而不是表名(或SQL关键字等)一起使用.所以你基本上没有运气了.
但是,请不要担心,因为此机制旨在防止SQL注入,并且您通常知道在代码编写时要访问哪个表,因此很可能有人可能会注入恶意代码.然后继续在字符串中写表.
如果,由于某些(可能是有悖常理的)原因,您保持表名参数如下:
例如:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
Run Code Online (Sandbox Code Playgroud)
#1:让第三个%s在这个时候被另一个'%s'替换,以便以后通过psycopg2处理
#2:这是psycopg2正确引用的字符串,而不是原始字符串中的第三个'%s'