如何从数组列中进行选择而不会出现格式错误的数组错误

时间:2019-06-17 16:41:40

标签: arrays python-3.x postgresql psycopg2

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

我希望从一个表中进行选择,其中的一列是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.

感谢所有帮助:)

2 个答案:

答案 0 :(得分:2)

好的。有时我会因自己的愚蠢而惊奇……

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

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

感谢所有提出建议的人。

答案 1 :(得分:1)

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