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

Cro*_*ent 1 python postgresql postgresql-10

我刚刚开始使用PostgreSQL并且遇到了一些问题.我正在使用Psycopg2并在AWS RDS上托管PostgreSQL数据库.这是我试图执行的查询:

cursor.execute('SELECT id FROM fqdn AS domain WHERE domain.fqdn IS {0}'.format(fqdn_str))
Run Code Online (Sandbox Code Playgroud)

fqdn_str是这样的域名:

https://www.example.com
Run Code Online (Sandbox Code Playgroud)

和fqdn表是这样的:

CREATE TABLE fqdn (
    id SERIAL PRIMARY KEY,
    fqdn TEXT NOT NULL,
    date_last_crawled TIMESTAMP WITH TIME ZONE NOT NULL,
        UNIQUE (fqdn)
);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

psycopg2.ProgrammingError: syntax error at or near "https"
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,所以我希望得到一些帮助.如果您需要更多信息,请告诉我.谢谢.

编辑:

如果我将格式字符串更改为%s,如文档中所示,我会收到以下错误:

TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

Ral*_*alf 5

正如用户@SahapAsci在对该问题的评论中建议的那样,您应该使用SQL查询的参数(阅读文档)来避免SQL注入漏洞.

我链接的文档甚至有一个很好的说明:

在此输入图像描述

但我怀疑@SahapAsci在他们的评论中提出的代码有一个小错误.用户建议使用以下代码:

cursor.execute(
    'SELECT id FROM fqdn AS domain WHERE domain.fqdn IS %s',
    (fqdn_str)) 
Run Code Online (Sandbox Code Playgroud)

但我认为你需要在参数元组中添加一个逗号,因为否则它不会是一个元组而只是一个字符串,它将被解释为一个可迭代的并且只使用第一个字符(然后抛出错误你提到:) "TypeError: not all arguments converted during string formatting".我链接的文档甚至要注意这个特定情况.

而你可能应该=代替我们IS,但我不会确定最后一部分.

所以你的最终代码应该是这样的:

cursor.execute(
    'SELECT id FROM fqdn AS domain WHERE domain.fqdn = %s',
    (fqdn_str, )) 
Run Code Online (Sandbox Code Playgroud)