0

unnest配列データがない場合は正常に動作します。配列列を一括挿入したい。次のような私の入力:[[1, 2], [1]]

create table test_array
(
    arr int[],
    info text[]
);

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

insert into test_array(
arr)
values (
unnest_2d_1d(array[[1,2], [3,4]]::int[]));  -- work fine


insert into test_array(
arr)
values (
unnest_2d_1d(array[[1,2], [3]]::int[]));   -- will failed

失敗したエラーは次のとおりです。

 ERROR: multidimensional arrays must have array expressions with matching dimensions

unnest_2d_1dそのよう な関数はすべて異なる長さの配列をサポートできませんが、配列を 1 レベルずつアンネストします。

別の同じエラーが array_dims で発生しました:

postgres=# SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8]])
postgres-# ;
ERROR:  multidimensional arrays must have array expressions with matching dimensions

unnest_2d_1d失敗したものを成功にするために何をする必要がありますか?

なぜ私はunnestをしなければならないのですか。asyncpg execute_many戻り値を破棄するためです。したがって、データを挿入するには1つのSQLを使用する必要があります。しかし、配列の列は、長さが異なる 1 つの次元のようなものです。

---- いくつかの python と asyncpg を追加します

この問題に関連する github の問題を見つけました 。https ://github.com/brianc/node-postgres/issues/1644

これを試すとき:

async def h():
    async with misc.pg_pool.acquire() as connection:
        stmt = await connection.prepare(f"""
            insert into test_array(info)  select (info::text[]) from  unnest($1::text[])
            AS t(info)
        """)
        await stmt.fetch([["sd", "dg"]])

これを得ました

InvalidTextRepresentationError: malformed array literal: "sd"
DETAIL:  Array value must start with "{" or dimension information.
4

1 に答える 1