尝试在PostgreSQL 10中选择数据时出现查询错误

时间:2019-01-11 07:46:07

标签: postgresql postgresql-10 python

我刚开始使用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

2 个答案:

答案 0 :(得分:5)

@sahapAsci用户在对该问题的评论中建议,您应该为SQL查询使用参数(阅读docs),以避免SQL注入漏洞。

我链接的文档甚至有一个很好的注释:

enter image description here

但是我怀疑在他们的注释中建议的@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