使用NodeJS的PostgreSQL JSON类型的最佳方法是什么

时间:2014-03-12 16:36:50

标签: json node.js postgresql

我在这里面临一些分析瘫痪。使用NodeJS编程数据库有很多选择,我有点迷失。

我正在使用Express构建一个API服务器,它将与移动设备上的HTML5应用程序通信。我决定使用PostgreSQL,因为我的数据是"非常关系"和PostgreSQL新的JSON数据类型将使我的生活更轻松。

不幸的是,我无法找到PostgreSQL的任何库来利用新的JSON数据类型或公开它。我考虑过使用Sequelize并使用原始的pgsql模块编写一个很好的ORM或滚动自己的东西。

有人能说清楚吗?我在一些NodeJS堆栈交换中问这个问题,但我认为我们没有具体的那个。

5 个答案:

答案 0 :(得分:8)

我喜欢https://github.com/brianc/node-postgres。它积极开发,只是一个很好的薄层。

要在准备好的查询中使用json类型,只需要JSON.stringify无论你想要存储为json(无论如何都是postgres想要它)。

答案 1 :(得分:3)

Objection.js非常支持relational数据以及JSONB数据。

您无需执行任何技巧来解析/字符串化json数据。这一切都是自动完成的。您可以声明模式以允许验证您将要放置数据库等的数据。

可以将嵌套的关系对象层次结构插入到DB中,并生成行以更正表,并且您可以使用javascript API查询JSON列中的数据,因此无需为此编写RAW SQL。

编辑:

不知道为什么在这里投票(当前为-2),Objection.js仍然对节点世界中Postgresql的JSONB操作有最好的支持(当前答案中唯一的选择,对postgresql有任何特殊支持) jsonb处理)。

最新增加的是支持在JSONB列中仅修补部分数据,其中objection.js会自动为您构建jsonb_set()次调用。

例如:

ModelWithJsonColumn.query().update({
  'jsonColumn:attribute' : 'new value',
  otherColum: ref('jsonColumn:extractThisAttribute')
}).where('id', 1).returning('*')

将创建如下的更新查询:

update "ModelWithJsonColumn" set 
    "jsonColumn" = jsonb_set("jsonColumn", '{attribute}', to_jsonb('new value'), true), 
    "otherColumn" = "jsonColumn"#>'{extractThisAttribute}'
where "id" = 1 returning *

也可以在

中的每个查询构建器方法中使用ref()语法
.select(['id', ref('jsonArrayColumn:[0]')])

.where('name', ref('jsonColumn:middleName')) 

甚至加入

.join('PetTable', 
      ref('PetTable.jsonColumn:details.name'), 
      '=', 
      ref('ThisTable.someOtherJsonbColumn:dogName'))

答案 2 :(得分:0)

带有pg扩展名的

Any-db对我来说很有用。

答案 3 :(得分:-1)

pg-promise是使用PostgreSQL和Node JS的最简单方法,它使用promises扩展node-postgres,用于自动连接和事务。

答案 4 :(得分:-3)

我也搜索了这个问题的答案,并在相关问题中找到了类似的解决方案。

var pg = require("pg");
var Promise = require("bluebird");

Object.keys(pg).forEach(function(key) {
    var Class = pg[key];
    if (typeof Class === "function") {
        Promise.promisifyAll(Class.prototype);
        Promise.promisifyAll(Class);
    }
})
Promise.promisifyAll(pg);

这允许您将pgPromise一起使用。详情请Manually promisifying pg.connect with Bluebird