1

複合型配列を使用して db 構造を作成しました。plv8 を使用していくつかの値を挿入したいのですが、この配列を挿入するための正しい構造が見つかりません。

私が得ているエラーは次のとおりです。

ERROR:  malformed record literal: "[object Object]"
SQL state: 22P02
DETAIL:  Missing left parenthesis.

ARRAY[ROW()] での挿入が機能することはわかっていますが、挿入する必要がある配列全体の長い文字列を作成する必要があります。以下は私が作った構造と私が試したインサートです。この配列/オブジェクトをplv8で挿入する正しい方法は何ですか?

CREATE TYPE mydb.langpath AS
(lang text,
path text[]);

CREATE TABLE mydb.paths
(
info text NOT NULL,
langpath mydb.langpath[],
 )

do language plv8 $$ 
var plan=plv8.prepare('INSERT INTO mydb.paths( info, langpath) VALUES($1, $2)', ['text','mydb.langpath[]'] );
var params=new Array();
params.push('infotext');
var arr=[]; /*this structure is normally created by other functions*/
var pts=[];
pts.push('abc');
pts.push('def');
arr.push({lang:'EN',path:pts}); /*arr can have more values.*/
params.push(arr);
plan.execute(params);
$$
4

1 に答える 1

1

私はあなたが望むものを部分的にしか解決できませんでした (以下のコードを参照)。配列(配列としてのパス)を含むコンポジットに挿入できましたが、コンポジットの配列(配列としてのlangpath)には挿入できませんでした。

プレーンSQLでは、これは可能に見えます-私のクエリが正しい場合=)(下部のコードを参照)。したがって、これは PLV8 の準備/実行の問題である可能性があります。

私は個人的にこのモデルを複数のテーブルに分割し、データベースに得意なことをさせます。または、あるレベルで json を使用するだけかもしれません。ネストされた構造の方が適していて、すでに JavaScript エンジン (PLV8) が利用可能です。Postgresql (バージョン 9.5 以降) は、PLV8 なしで json を非常に適切にサポートしています。9.2 から 9.4 では、json の操作のサポートは限定的でした。ドキュメントの基本的なインデックス作成も実行できるようになりました (GIN を使用)。

これが私ができたことの完全なコードです。langpathの配列が欠落していることに注意してください。

-- Installed plv8 via apt (Ubuntu 15.10) for Postgresql9.5
--CREATE EXTENSION plv8;   
DROP SCHEMA IF EXISTS mydb CASCADE;
CREATE SCHEMA mydb;

CREATE TYPE mydb.langpath AS (
    lang text,
    path text[]
);

CREATE TABLE mydb.paths (
    info text NOT NULL,
    langpath mydb.langpath
);

DO LANGUAGE plv8 $$ 
var plan=plv8.prepare("INSERT INTO mydb.paths(info, langpath) VALUES($1, $2)", ['text', 'mydb.langpath'] );
var params=new Array();
params.push('infotext');
var pts=[];
pts.push('englishPath1');
pts.push('englishpath2');
params.push({lang:"EN",path:pts});
plan.execute(params);
$$

SELECT path FROM (SELECT (langpath).* FROM mydb.paths) a;
/*
row  |  path (text[])
-----|-------------------------------
1    |  {englishPath1,englishpath2}
*/

SELECT path[1] FROM (SELECT (langpath).* FROM mydb.paths) a;
/*
row  |  path (text)
-----|-------------------------------
1    |  englishPath1
*/

完全を期すために、ネストされた配列から値を選択するクエリの例とともに、プレーン SQL を介して元のテーブル定義に挿入することをテストするコードを次に示します。

INSERT INTO mydb.paths(info, langpath) VALUES('infotext', 
    ( array[
            row('EN', array['englishPath1', 'englishPath2']),
            row('FR', array['frenchPath1', 'frenchPath2'])
           ]::mydb.langpath[]
    )
);

SELECT path[2] FROM (
    SELECT (langpath).* FROM (
        SELECT langpath[1] FROM mydb.paths
    ) a
) b
于 2016-04-18T16:48:40.227 に答える