Kueri berikut berfungsi:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Namun, saya tidak dapat menggunakan jenis kolom yang berbeda seperti 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.
Tampaknya, dalam kasus kedua, jenis kolom disimpulkan sebagai unknown
, yang tidak dilemparkan ke varchar(255)
otomatis.
Bagaimana saya membuat contoh kedua berfungsi dan mengembalikan kolom dengan tipe yang tepat, jika mungkin tanpa peringatan dan tanpa mengubah ARRAY[...]
definisi?
Latar Belakang: Saya mencoba untuk meningkatkan kinerja operasi penyisipan massal besar menggunakan psycopg2
modul Python, yang tidak mendukung penggunaan beberapa baris dalam VALUES
argumen. Saya menemukan contoh di atas ketika mencoba beberapa metode lain.
VALUES
. Berikut ini berfungsi dengan baik untuk saya: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,))
tidak ada.Jawaban:
Anda bisa melakukan ini tanpa membuat peringatan dengan membuat tipe dan melemparkan catatan ke sana:
diuji pada 9.4 dan 9.3 (db <> biola di sini )
sumber
Itu jelek, tetapi Anda dapat mencoba:
Dengan cara ini tipe yang didefinisikan
AS
sesuai dengan outputunnest()
, yang dapat Anda gunakan untuk kebutuhan Anda dalamSELECT
daftar.Anda dapat mencoba ini di SQLFiddle kecil .
sumber
Haruskah melakukannya:
sumber
psycopg2
untuk memasukkan tipe gips ke dalamARRAY[...]
definisi. Apakah mungkin melakukannya tanpa? Saya mengedit pertanyaan saya untuk mencerminkan hal itu.