将 PostgreSQL JSON 类型与 NodeJS 一起使用的最佳方法是啥

Posted

技术标签:

【中文标题】将 PostgreSQL JSON 类型与 NodeJS 一起使用的最佳方法是啥【英文标题】:What is the best way to use PostgreSQL JSON types with NodeJS将 PostgreSQL JSON 类型与 NodeJS 一起使用的最佳方法是什么 【发布时间】:2014-04-16 23:23:46 【问题描述】:

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

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

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

有人可以提供线索吗?我会在一些 NodeJS stackexchange 上问这个问题,但我认为我们没有这样具体的问题。

【问题讨论】:

我使用 sequelize 并将 JSON 字符串化并解析出来。我喜欢这个设置。当我使用 mongo 和 mongoose 时更是如此。 使用 sequelize,您将无法查询 jsonb 列中包含某些数据的行,也无法仅修补 jsonb 列中的某些字段。 【参考方案1】:

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

要在准备好的查询中使用 json 类型,只需 JSON.stringify 尝试存储为 json 的任何内容(这就是 postgres 想要的方式)。

【讨论】:

【参考方案2】:

Objection.js 对relational 数据和JSONB 数据有很好的支持。

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

可以将嵌套的关系对象层次结构插入数据库,并生成行以更正表,并且您有 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'))

【讨论】:

【参考方案3】:

Any-db 带有 pg 扩展名非常适合我。

【讨论】:

这些天长期不受支持和无法使用。【参考方案4】:

pg-promise 是将 PostgreSQL 与 Node JS 结合使用的最简单方法,它通过 Promise 扩展了 node-postgres,用于自动连接和事务。

【讨论】:

【参考方案5】:

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

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);

这允许您将pgPromises 一起使用。详情看这里Manually promisifying pg.connect with Bluebird

【讨论】:

以上是关于将 PostgreSQL JSON 类型与 NodeJS 一起使用的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

将 json 对象存储到 postgresql 中的数据类型是啥?

PostgreSQL 9.2 - 将 TEXT json 字符串转换为 json/hstore 类型

将 PostgreSQL JSON 列映射到 Hibernate 实体属性

如何在 Django 中使用 PostgreSQL 9.2 JSON 数据类型?

如何使用 PySpark 将 JSON 列类型写入 Postgres?

PostgreSQL 中 JSON 数据类型的大小限制