如何插入复合类型plv8
How to insert composite type plv8
我创建了一个带有复合类型数组的数据库结构。我想使用 plv8 插入一些值,但我找不到正确的结构来插入这个数组。
我得到的错误是:
ERROR: malformed record literal: "[object Object]"
SQL state: 22P02
DETAIL: Missing left parenthesis.
我知道用 ARRAY[ROW()] 插入是可行的,但是我必须为必须插入的整个数组制作一个长字符串。
下面是我制作的结构和我尝试过的插入。
用 plv8 插入这个 array/object 的正确方法是什么?
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(, )', ['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);
$$
我只能部分解决你想要的问题(见下面的代码)。我能够插入包含数组的组合(路径作为数组),但不能插入组合数组(langpath 作为数组)。
简单地说 sql 这看起来是可能的 - 如果我的查询是正确的=)(见底部的代码)。所以这可能是 PLV8 prepare/execute.
的问题
我个人将这个模型拆分为多个 table,让数据库做它擅长的事情。
或者也许只是在某种程度上使用 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(, )", ['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 插入原始 table 定义的代码,以及从嵌套数组查询 select 值的示例。
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
我创建了一个带有复合类型数组的数据库结构。我想使用 plv8 插入一些值,但我找不到正确的结构来插入这个数组。
我得到的错误是:
ERROR: malformed record literal: "[object Object]"
SQL state: 22P02
DETAIL: Missing left parenthesis.
我知道用 ARRAY[ROW()] 插入是可行的,但是我必须为必须插入的整个数组制作一个长字符串。 下面是我制作的结构和我尝试过的插入。 用 plv8 插入这个 array/object 的正确方法是什么?
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(, )', ['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);
$$
我只能部分解决你想要的问题(见下面的代码)。我能够插入包含数组的组合(路径作为数组),但不能插入组合数组(langpath 作为数组)。
简单地说 sql 这看起来是可能的 - 如果我的查询是正确的=)(见底部的代码)。所以这可能是 PLV8 prepare/execute.
的问题我个人将这个模型拆分为多个 table,让数据库做它擅长的事情。 或者也许只是在某种程度上使用 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(, )", ['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 插入原始 table 定义的代码,以及从嵌套数组查询 select 值的示例。
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