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

标签 postgresql postgresql-10 python

我刚刚开始使用 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)漏洞。

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

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, )) 

关于postgresql - 尝试在 PostgreSQL 10 中选择数据时出现查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144013/

相关文章:

java - 为什么我的 Play 框架模型作为空白记录保存到数据库中?

sql - A喜欢B,B不喜欢A?

python - 从 Django 中的现有表 (postgresql) 进行查询?

PostgreSQL 负整数溢出

python - Anaconda 在 MAc OS 上安装错误

python - Altair 图表轴对于像 matplotlib 这样的小 float 字不能很好地缩放

mysql - Slick 2 中的多个 PostgreSQL 数据库(同一服务器)访问

python - Postgresql插入多列格式错误的数组文字

postgresql - 需要在 postgresql 的不同 session 中使用一个临时表

python - 将 csr_matrix 中的几列归零