2014-03-12 65 views
8

我在這裏面臨一些分析癱瘓。使用NodeJS編程數據庫有很多選擇,我有點遺憾。什麼是最好的方式與NodeJS使用PostgreSQL JSON類型

我正在使用Express構建一個API服務器,它將與移動設備上的HTML5應用程序進行通信。我決定使用PostgreSQL,因爲我的數據是「非常關係的」,而PostgreSQL新的JSON數據類型將使我的生活變得更加輕鬆。

不幸的是,我無法找到任何PostgreSQL的庫來利用新的JSON數據類型或暴露它。我想過使用Sequelize,並有一個很好的ORM或通過使用原始pgsql模塊來滾動我自己的東西。

有人可以提供線索嗎?我會問一些NodeJS stackexchange,但我不認爲我們有這樣的具體細節。

+2

我使用sequelize,只是將JSON加入並解析它出來。我喜歡這個設置。更何況,當我用芒果和貓鼬時。 – MikeSmithDev

+0

使用sequelize,您將無法查詢在jsonb列中包含某些數據的行,也無法在jsonb列中修補某個字段。 –

回答

4

我喜歡https://github.com/brianc/node-postgres。它積極開發,只是一個很好的薄層。

要在準備好的查詢中使用json類型,只需JSON.stringify無論您試圖將其存儲爲json(這就是postgres無論如何都需要的)。

-2

Any-db與pg的擴展工作對我很好。

+0

最近不受支持且無法使用。 –

0

pg-promise是使用PostgreSQL和Node JS的最簡單的方法,它使用承諾擴展了node-postgres,用於自動連接和事務。

-1

Objection.jsrelational數據以及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')) 
-2

我也搜索了這個問題的答案,發現類似的相關問題的解決。

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

相關問題