水线中的Postgres数组类型转换为文本

时间:2014-06-12 12:19:31

标签: arrays postgresql sails.js waterline

我需要创建一个App。我们使用PostgreSQL作为底层数据库。我们决定Postgres的原因是因为我们想要一个关系数据库,因为各种实体及其关系(对于像Mongo这样的NoSQL数据库似乎并不理想,因为会有多个连接),同时我们想利用它的优势Postgres的数组和JSON数据类型在MySQL中不可用。

我们正在使用SailsJS框架,因为它简单,内置在socket.io API和我之前(虽然非常有限)使用此框架(使用MongoDB作为底层数据库)的经验。它使用水线作为基础ORM。

Model.query()实际上是一个很棒的功能,它允许我运行本机SQL查询。

我面临的问题与定义具有Postgres数组数据类型的模型有关。默认情况下,如果我签入数据库,则该列将更改为DB中的text数据类型。 我需要使用postgre的数组函数构建来操作数组字段。但为此,我需要能够创建一个具有所需类型的表。我需要知道这怎么可能?

2 个答案:

答案 0 :(得分:4)

在定义Waterline模型时使用json字段类型,例如:

module.exports = {

    attributes: {

        name: 'string',
        my_array: 'json',
        ...etc...
    }

}

然后您可以将数组数据直接保存到模型中,例如:

User.create({name: 'bob', my_array: [1,2,3]}).exec(...);

它将由底层适配器转换为JSON或从JSON转换。对于sails-postgresql,它将使用json列类型。

答案 1 :(得分:0)

我没有在这里运行node.js,所以现在无法测试它。但请尝试以下方法:

  1. 使用数组构造函数语法
  2. 使用适当的enquoting

  3. 至1)

     SELECT ARRAY[1,2,3+4];
    

    至2)

    PostgreSQL documentation states

      

    请记住,您在SQL命令中编写的内容将首先解释为字符串文字,然后解释为数组。这会使您需要的反斜杠数量翻倍。例如,要插入包含反斜杠和双引号的文本数组值,您需要写:

    INSERT ... VALUES (E'{"\\\\","\\""}');
    

    Example fiddle with proper enquoting