Следующий запрос работает:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Однако я не смог использовать другой тип столбца, такой как varchar(255)
:
SELECT a, b
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b varchar(255));
ERROR: 42804: function return row and query-specified return row do not match
DETAIL: Returned type unkown at ordinal position 2, but query expects text.
Похоже, что во втором случае тип столбца выводится как unknown
, который не приводится varchar(255)
автоматически.
Как заставить второй пример работать и возвращать столбцы с правильным типом, если это возможно без предупреждений и без изменения ARRAY[...]
определения?
Предыстория: я пытаюсь улучшить производительность больших операций массовой вставки с помощью psycopg2
модуля Python, который не поддерживает использование нескольких строк в VALUES
аргументах. Я наткнулся на приведенный выше пример, пробуя другие методы.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
не существует.
VALUES
. Следующее прекрасно работает для меня:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))