将 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);
这允许您将pg
与Promise
s 一起使用。详情看这里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 数据类型?