【问题标题】:Postgres array datatype in waterline being converted to text水线中的 Postgres 数组数据类型被转换为文本
【发布时间】:2014-06-12 12:19:30
【问题描述】:

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

我们使用 SailsJS 框架是因为它的简单性、内置 sockets.io API 以及我之前(尽管非常有限)使用该框架的经验(使用 MongoDB 作为底层数据库)。它使用水线作为底层 ORM。

Model.query() 真的是一个很棒的功能,它允许我运行原生 SQL 查询。

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

【问题讨论】:

    标签: arrays postgresql sails.js waterline


    【解决方案1】:

    在定义 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 列类型。

    【讨论】:

    • 感谢 Scott。当我通过 post 请求 { "intColumn" : 1, "jsonColumn": [1,2,3] } 发送数据包时出现错误消息:{ "status": 500, "errors": [ "invalid input syntax for type json" ] }
    • 不确定,对我来说就像一个魅力。你使用的是什么版本的 Sails/sails-postgresql?
    • 嗨,斯科特,很抱歉回复晚了。它适用于 Sails beta。但是如何访问 json 数组的键呢?例如选择 my_array[0] 不起作用
    【解决方案2】:

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

    1. 使用数组构造函数语法
    2. 使用正确的引用

    到 1)

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

    至 2)

    PostgreSQL documentation states:

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

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

    Example fiddle with proper enquoting.

    【讨论】:

    • 嗨斯特凡,我猜你误解了这个问题。我面临的问题与 Postgres 的数组数据类型无关,而是作为 ORM 的水线如何处理它们。我可以轻松地使用数组数据类型,但水线没有这个功能。我正在寻找解决方法
    • 啊,好的。然后我必须稍后再调查。我以为您遇到的问题是您向 ORM 提供的查询没有被正确引用。
    猜你喜欢
    • 2018-04-25
    • 2012-11-20
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多