python - 为什么带有 SQL 查询参数的 psycopg2 cursor.execute() 会导致语法错误?

标签 python sql postgresql psycopg2

在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. 如果表名来自您的程序(例如字典或类属性),则执行通常的字符串替换。
  2. 如果表名来自外部世界(想想“用户输入”):要么不这样做,要么完全信任用户并应用之前的方法 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/

相关文章:

postgresql - 在 Access 中链接外部表时,如何将默认数据类型从 Decimal 更改为 Double?

python - 多终端,多命令,lxterminal

python - 通过访问 token 连接到 Microsoft Graph

MYSQL:尝试在 close_dt 间隔内计算 Property_ID

sql - hive 加入选择非常慢

sql - 我怎样才能只得到一个数字的第一位小数而不四舍五入

postgresql - DefaultServeMux 中的 SQL 给出错误

java - 使用 Spring 3 生成在 Postgres 中使用游标的 sql

python - Selenium 在页面中找不到元素

java - 带有java客户端的python套接字服务器-socket.error : [Errno 32] Broken pipe