PostgreSQLクエリで返される不明な型


9

次のクエリは機能します。

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番目のケースでは、列タイプはとして推論されているようでunknownvarchar(255)自動的にはキャストされません。

警告とARRAY[...]定義を変更せずに、可能であれば、2番目の例を機能させて正しい型の列を返すにはどうすればよいですか?

背景:引数にpsycopg2複数の行を使用することをサポートしていないPythonモジュールを使用して、大規模な一括挿入操作のパフォーマンスを改善しようとしていVALUESます。他のいくつかの方法を試しているときに、上の例に出くわしました。


psycopg2がの複数の行をサポートしていないとあなたが言う理由がわかりません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,))しないということです。
FX

ああ、あなたは配列を単一のパラメータとして置き換えることを望んでいると思います。
デイブジョーンズ

回答:


7

タイプを作成してレコードをキャストすることで、警告を生成せずにこれを行うことができます。

create type t as (a integer, b varchar(255));

select * from unnest(array[(1,'hello'), (3,'world')]::t[]);
┌───┬───────┐
 a    b   
├───┼───────┤
 1  hello 
 3  world 
└───┴───────┘

9.4および9.3でテスト済み(db <> fiddle here


7

醜いですが、試すことができます:

SELECT a, b::text
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b unknown);

このようにして、で定義されたタイプASがの出力と一致unnest()しますSELECT。これは、リストのニーズにキャストできます。

小さなSQLFiddleでこれを試すことができます。


1

それを行う必要があります:

SELECT a, b
FROM unnest(ARRAY[(1,varchar 'hello'), (3,varchar 'world')])
AS t(a integer, b varchar(255));

1
これは機能psycopg2しますが、ARRAY[...]定義内に型キャストを含めるように強制することができませんでした。なしでそれを行うことは可能ですか?それを反映するように質問を編集しました。
FX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.