2016-04-18 9 views
1

複合型配列を持つdb構造体を作成しました。私はplv8を使用していくつかの値を挿入したいと思いますが、この配列を挿入する正しい構造体を見つけることができません。複合型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); 
$$ 

答えて

1

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

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

私は個人的にこのモデルを複数のテーブルに分割して、データベースにそれがうまくいくようにします。 または、あるレベルでjsonを使用するだけで、ネストされた構造の方が優れており、既にjavascriptエンジンを利用できます(PLV8)。 Postgresql(バージョン9.5以降)は、PLV8なしのjsonをかなりサポートしています。 9.2から9.4まで、jsonを操作するためのサポートは限られていました。今、あなたはまた、ここで

は、langpathに欠損配列に注意してください、私はやることができたかの完全なコードです(使用GIN)ドキュメントのいくつかの基本的なインデックス作成を行うことができます。完全性については

-- 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 
+1

私はplv8にしようとしていたものを恐れていたようので、私は、私は複合型指定されたオブジェクトの配列を必要としない推奨されているように私のDB構造を変更することを決めた、ことはできません。 – DavidVdd

関連する問題