【问题标题】:How to select from an array column without getting malformed array errors如何从数组列中进行选择而不会出现格式错误的数组错误
【发布时间】:2019-10-31 07:10:45
【问题描述】:

我花了一个小时左右的时间在谷歌上搜索并尝试了各种组合,但没有成功。

我希望从其中一列是 varchar(255) 的一维数组的表中进行选择。

在普通 SQL 中,我使用以下查询:

SELECT * FROM customers WHERE email_domains @> '{"@google.com"}';

效果很好。 但现在我想从代码中做同样的事情。所以我尝试了这个:

domain = '@google.com'
sql = "SELECT * FROM customers WHERE email_domains @> '{%s}';"

cursor.execute( sql, [domain] )
result = cursor.fetchall() 

还有一大堆转义的 ' 和 " 的各种组合,但我无法让它工作。

我得到的错误是这样的:

ERROR: malformed array literal: "{"
LINE 1: ... * FROM customers WHERE email_domains @> '{'@goo....
                                                         ^
DETAIL:  Unexpected end of input.

感谢所有帮助:)

【问题讨论】:

  • 看起来 '@google' 中的 @g 作为数组运算符的开头被中断。我目前没有要测试的环境,但我想到了两个选项。 1) 尝试转义域 "domain='\@google' 中的 @ 2) 使用数组构造函数 "WHERE email_domains @> ARRAY ['%s'];"
  • 我尝试将@google.com 更改为不带@ 的anything.com,以查看我收到的错误消息。就是这个 ERROR:root:Failed to process Customer: "anything" LINE 1 或附近的语法错误:...FROM customers WHERE email_domains @> '{'anything.com'...
  • 但是转义它给了这个 Failed to process Customer: syntax error at or near "\" LINE 1: ...FROM customers WHERE email_domains @> '{'\@anything.co..跨度>

标签: arrays python-3.x postgresql psycopg2


【解决方案1】:

好的。有时我会为自己的愚蠢感到惊讶......

解决方案(对我来说)是简单地将我的 sql 重组为:

SELECT * FROM customers WHERE %s  = ANY(email_domains);

感谢所有提供建议的人。

【讨论】:

    【解决方案2】:

    psycopg2 为您将列表转换为数组。我目前无法轻松测试,但我相信这应该可行:

    domain = ['@google.com']
    # Let psycopg2 do the escaping for you, don't put quotes in there
    sql = "SELECT * FROM customers WHERE email_domains @> %s;"
    
    cursor.execute( sql, [domain] )
    result = cursor.fetchall() 
    

    【讨论】:

    • 谢谢,但它没有用.. 它给出了这个错误格式错误的数组文字:“@google.com”,sql 看起来像这样 * FROM customers WHERE email_domains @> '@google.c...
    • 嗯,奇怪。您确实将域更改为(一个)域列表,对吧?
    • 不,你是对的。我错过了!但是..域是一个字符串'@google.com'所以如果我像这样使用cursor.execute(sql,[domain])我会收到这个错误:格式错误的数组文字:“@google.com”如果我使用它像这样 cursor.execute( sql, [[domain]] ) 我得到这个错误:运算符不存在:字符变化 [] @> text[]
    • 我找到了解决方案并相应地回答了我自己的问题。
    • @TheWelshDragon Yes in PostgreSQL character varying (varchar) 和 text 是两种不同的类型。您需要像 ... WHERE email_domains @> %s::varchar[]; 这样的显式类型转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多