我刚开始使用PostgreSQL,有一个问题。我正在使用Psycopg2并将PostgreSQL数据库托管在AWS RDS上。这是我要执行的查询:
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
答案 0 :(得分:5)
@sahapAsci用户在对该问题的评论中建议,您应该为SQL查询使用参数(阅读docs),以避免SQL注入漏洞。
我链接的文档甚至有一个很好的注释:
但是我怀疑在他们的注释中建议的@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, ))
答案 1 :(得分:1)
在WHERE子句中按=更改IS。
CREATE TABLE T(ID text);
INSERT INTO T VALUES ('https://www.example.com');
SELECT * FROM T WHERE ID IS 'https://www.example.com';
错误:“'https://www.example.com'”或附近的语法错误
第1行:SELECT * FROM T WHERE ID is'https://www.example.com';
SELECT * FROM T WHERE ID = 'https://www.example.com';
| id | | :---------------------- | | https://www.example.com |
db <>提琴here