Как выбрать из массива столбца, не получая ошибочные ошибки массива - PullRequest
0 голосов
/ 17 июня 2019

Я потратил примерно час на поиски в разных комбинациях, но безуспешно.

Я хочу выбрать из таблицы, где один из столбцов является одномерным массивом 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 ]

2 голосов
/ 17 июня 2019

Хорошо.Иногда я поражаюсь своей глупости ...

Решение (для меня) состояло в том, чтобы просто реструктурировать мой sql следующим образом:

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

Спасибо всем, кто предложил свои предложения.

1 голос
/ 17 июня 2019

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