Các truy vấn sau đây hoạt động:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Tuy nhiên, tôi không thể sử dụng một loại cột khác, chẳng hạn như 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.
Có vẻ như, trong trường hợp thứ hai, loại cột được suy ra unknown
là không được varchar(255)
tự động chuyển thành.
Làm cách nào để làm cho ví dụ thứ hai hoạt động và trả về các cột với đúng loại, nếu có thể mà không có cảnh báo và không sửa đổi ARRAY[...]
định nghĩa?
Bối cảnh: Tôi đang cố gắng cải thiện hiệu suất của các hoạt động chèn số lượng lớn bằng psycopg2
mô-đun Python, không hỗ trợ sử dụng nhiều hàng trong các VALUES
đối số. Tôi vấp vào ví dụ trên trong khi thử một số phương pháp khác.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
không tồn tại.
VALUES
. Những điều sau đây chỉ tốt cho tôi:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))