次のクエリは機能します。
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.
2番目のケースでは、列タイプはとして推論されているようでunknown
、varchar(255)
自動的にはキャストされません。
警告とARRAY[...]
定義を変更せずに、可能であれば、2番目の例を機能させて正しい型の列を返すにはどうすればよいですか?
背景:引数にpsycopg2
複数の行を使用することをサポートしていないPythonモジュールを使用して、大規模な一括挿入操作のパフォーマンスを改善しようとしていVALUES
ます。他のいくつかの方法を試しているときに、上の例に出くわしました。
つまり、存在しないなどの任意の数の行をサポート
—
FX
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'))