LISTEN channel_name;由于'对'而失败

问题描述 投票:1回答:1

我想使LISTEN channelname可配置。

queue_listen_name = config["database"]["listen_channel"]
cur.execute("LISTEN %s;", (queue_listen_name,))

但是这段代码失败了,因为postgresql在收听频道时不喜欢单引号:

psycopg2.ProgrammingError: syntax error at or near "'channel_name'"
LINE 1: LISTEN 'channel_name';

它在使用双引号(在psql上测试)时确实有效。

我能做什么?我不想自己构建一个字符串,然后在该字符串上使用cur.execute(),因为有明显的SQL注入原因。

所以这不是我想要做的:

queue_listen_name = "LISTEN {};".format(config["database"]["listen_channel"])
cur.execute(queue_listen_name)
python python-3.x postgresql psycopg2
1个回答
1
投票

从手册中获取,这两个应该工作,并被描述为“安全”:

# This works, but it is not optimal, could crash
queue_listen_name = config["database"]["listen_channel"]
cur.execute("LISTEN %s;" % ext.quote_ident(queue_listen_name))

或更好

from psycopg2 import sql

cur.execute(
    sql.SQL("LISTEN {};")
        .format(sql.Identifier(queue_listen_name)))

您可以在这里阅读有关格式化的更多信息:http://initd.org/psycopg/docs/sql.html

© www.soinside.com 2019 - 2024. All rights reserved.