我刚刚开始使用 PostgreSQL,遇到了一些问题。我正在使用 Psycopg2 并在 AWS RDS 上托管 PostgreSQL 数据库。这是我要执行的查询:
cursor.execute('SELECT id FROM fqdn AS domain WHERE domain.fqdn IS {0}'.format(fqdn_str))
fqdn_str 是这样的域名:
https://www.example.com
fqdn 表是这样的:
CREATE TABLE fqdn (
id SERIAL PRIMARY KEY,
fqdn TEXT NOT NULL,
date_last_crawled TIMESTAMP WITH TIME ZONE NOT NULL,
UNIQUE (fqdn)
);
我得到的错误是这样的:
psycopg2.ProgrammingError: syntax error at or near "https"
我不知道我做错了什么,所以如果能给我一点帮助,我将不胜感激。如果您需要更多信息,请告诉我。谢谢。
编辑:
如果我将格式字符串更改为文档中所示的 %s,我会收到以下错误:
TypeError: not all arguments converted during string formatting
最佳答案
正如用户@SahapAsci 在对该问题的评论中建议的那样,您应该为 SQL 查询使用参数(阅读 docs)以避免 SQL 注入(inject)漏洞。
我链接的文档甚至有一个很好的说明:
但我怀疑@SahapAsci 在他们的评论中建议的代码有一个小错误。用户建议此代码:
cursor.execute(
'SELECT id FROM fqdn AS domain WHERE domain.fqdn IS %s',
(fqdn_str))
但我认为你需要在参数元组中添加一个逗号,否则它就不是一个元组而是一个字符串,它将被解释为一个可迭代的并且只使用第一个字符(然后抛出您提到的错误:"TypeError: not all arguments converted during string formatting"
)。我链接的文档甚至有一条注释,要注意这个特定案例。
您可能应该使用 =
而不是 IS
,但我不确定最后一部分。
所以你的最终代码应该是这样的:
cursor.execute(
'SELECT id FROM fqdn AS domain WHERE domain.fqdn = %s',
(fqdn_str, ))
关于postgresql - 尝试在 PostgreSQL 10 中选择数据时出现查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144013/