首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何插入复合型plv8

如何插入复合型plv8
EN

Stack Overflow用户
提问于 2016-04-18 13:47:03
回答 1查看 881关注 0票数 1

我创建了一个带有复合类型数组的db结构。我想使用plv8插入一些值,但是我找不到正确的结构来插入这个数组。

我得到的错误是:

代码语言:javascript
复制
ERROR:  malformed record literal: "[object Object]"
SQL state: 22P02
DETAIL:  Missing left parenthesis.

我知道使用ARRAYROW()进行插入是可行的,但是接下来我必须对整个数组进行一个长字符串的插入。下面是我所做的结构和我尝试过的插入。用plv8插入这个数组/对象的正确方法是什么?

代码语言:javascript
复制
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);
$$
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 16:48:40

我只解决了你想要的部分问题(见下面的代码)。我能够插入包含数组的复合(路径作为数组),但不能插入到复合数组(langpath作为数组)。

在普通sql中,这看起来是可能的--如果我的查询是correct=的话(请参见下面的代码)。因此,这可能是PLV8准备/执行中的一个问题。

我会亲自将这个模型分成多个表,让数据库做它擅长的事情。或者只是在某种程度上使用json,这对嵌套结构更好,而且您已经有了一个可用的javascript引擎(PLV8)。Postgresql (从9.5版起)已经很好地支持了没有PLV8的json。从9.2到9.4,对操纵json的支持有限。现在,您还可以对文档进行一些基本的索引(使用GIN)。

下面是我能够做的全部代码,请注意langpath缺少的数组:

代码语言:javascript
复制
-- 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插入原始表定义的代码,以及从嵌套数组中选择值的示例查询。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36695875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档