Следующий запрос работает:
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
аргументах. Я наткнулся на приведенный выше пример, пробуя другие методы.
VALUES
. Следующее прекрасно работает для меня:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
не существует.Ответы:
Вы можете сделать это без генерации предупреждения, создав тип и приведя к нему записи:
протестировано на 9.4 и 9.3 (дб <> скрипка здесь )
источник
Это некрасиво, но вы можете попробовать:
Таким образом, тип, определенный в,
AS
совпадает с выводомunnest()
, который вы можете привести в соответствии со своими потребностями вSELECT
списке.Вы можете попробовать это в небольшом SQLFiddle .
источник
Должен сделать это:
источник
psycopg2
включить приведение типов вARRAY[...]
определение. Можно ли обойтись без? Я отредактировал свой вопрос, чтобы отразить это.