Ошибка программирования: оператор не существует: bigint [] = integer [] - PullRequest
0 голосов
/ 22 января 2019

Я работаю с Python 3 и пакетом Postgres (https://pypi.org/project/postgres/).

У меня есть таблица, в которой один из столбцов является массивом BIGINT. Когда я пытаюсь работать с этим столбцом (выбрать, вставить и т. Д.), Используя список чисел Python, я получаю сообщение об ошибке.

Кажется, причина ошибки в том, что psycopg2 адаптирует список к массиву INTEGER, а не BIGINT. Он предлагает явное приведение, но я не смог найти в документации по psycopg2, как это сделать. (Ошибка исчезает, когда я передаю список чисел, которые слишком велики, чтобы уместиться в 4 байта, размером с INTEGER).

Это код, который я запустил:

db.all("SELECT phase from messages where recipients=%(reps)s", {'reps':[12,34]})

также происходит с:

db.all("SELECT phase from messages where recipients=ARRAY[12, 34]")

И это сообщение об ошибке, которое я получил:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/yoni/.local/lib/python3.6/site-packages/postgres/__init__.py", line 552, in all
    return cursor.all(sql, parameters)
  File "/home/yoni/.local/lib/python3.6/site-packages/postgres/cursors.py", line 145, in all
    self.execute(sql, parameters)
  File "/home/yoni/.local/lib/python3.6/site-packages/psycopg2/extras.py", line 313, in execute
    return super(NamedTupleCursor, self).execute(query, vars)
psycopg2.ProgrammingError: operator does not exist: bigint[] = integer[]
LINE 1: SELECT phase from messages where recepients=ARRAY[12,34]
                                                   ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

1 Ответ

0 голосов
/ 22 января 2019

Приведите массив к bigint[]:

db.all("SELECT phase from messages where recipients=ARRAY[12, 34]::bigint[]")
...