BookShelf是基於KNEX SQL查詢構建器的Node.js的JavaScript ORM。它具有基於承諾的和傳統的回調界面,交易支持,急切/嵌套的關係加載,多態性關聯以及對一對一,一對一和多一對多關係的支持。
它旨在與PostgreSQL,MySQL和SQLite3一起使用。
網站和文檔。該項目託管在Github上,並設有全面的測試套件。
書架旨在在查詢JavaScript中的數據庫並在這些對象之間形成關係時,為常見任務提供一個簡單的庫,從數據映射器模式中獲取很多想法。
憑藉簡潔的識字代碼庫,書架很容易閱讀,理解和擴展。它不會迫使您使用任何特定的驗證方案,並提供靈活,有效的關係/嵌套關聯加載和一流的交易支持。
這是一個精益對象鍵合的映射器,只要您需要一個與庫存約定完全不符的自定義查詢時,您可以下降到Raw Knex界面。
您需要從NPM安裝KNEX的副本,以及mysql
, pg
或sqlite3
。
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
通過傳遞初始化的KNEX客戶端實例來初始化書架庫。 KNEX文檔為不同數據庫提供了許多示例。
// Setting up the database connection
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : {
host : '127.0.0.1' ,
user : 'your_database_user' ,
password : 'your_database_password' ,
database : 'myapp_test' ,
charset : 'utf8'
}
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Defining models
const User = bookshelf . model ( 'User' , {
tableName : 'users'
} )
此初始化可能只能在您的應用程序中發生一次。當它為當前數據庫創建一個連接池時,您應該使用整個庫中返回的bookshelf
實例。您需要存儲由應用程序中的初始化創建的此實例,以便您可以參考它。遵循的一個常見模式是在模塊中初始化客戶端,以便您以後可以輕鬆地引用它:
// In a file named, e.g. bookshelf.js
const knex = require ( 'knex' ) ( dbConfig )
module . exports = require ( 'bookshelf' ) ( knex )
// elsewhere, to use the bookshelf client:
const bookshelf = require ( './bookshelf' )
const Post = bookshelf . model ( 'Post' , {
// ...
} )
這是一個讓您入門的示例:
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
const User = bookshelf . model ( 'User' , {
tableName : 'users' ,
posts ( ) {
return this . hasMany ( Posts )
}
} )
const Post = bookshelf . model ( 'Post' , {
tableName : 'posts' ,
tags ( ) {
return this . belongsToMany ( Tag )
}
} )
const Tag = bookshelf . model ( 'Tag' , {
tableName : 'tags'
} )
new User ( { id : 1 } ) . fetch ( { withRelated : [ 'posts.tags' ] } ) . then ( ( user ) => {
console . log ( user . related ( 'posts' ) . toJSON ( ) )
} ) . catch ( ( error ) => {
console . error ( error )
} )
.set()
時都可以處理值的轉換。 Model
,添加時間戳,屬性驗證和一些本機CRUD方法的替代方法。對圖書館有疑問嗎?快來加入我們的#Bookshelf FreeNode IRC頻道,以在KNEX.JS和Bookshelf.js上進行支持,或在堆棧溢出上發布問題。
如果您想為書架做出貢獻,您通常需要報告問題或提交拉裝。為此,在線存儲庫可在GitHub上找到。
為了進一步幫助建立本地開發環境或學習如何為書架做出貢獻,應該閱讀Github上可用的貢獻文檔。
是的,您可以調用.asCallback(function(err, resp) {
在任何數據庫操作方法上,並在任何數據庫操作方法上使用標準(err, result)
樣式回調接口(如果您願意)。
確保檢查傳遞給要獲取的初始模型的初始參數的類型是否正確。例如new Model({id: '1'}).load([relations...])
不會返回與new Model({id: 1}).load([relations...])
- 注意在一種情況下,ID是一個字符串,另一種是一個數字。如果從URL參數中檢索ID,這可能是一個常見的錯誤。
這只是一個問題,當您急切地加載數據而不先獲取原始型號的情況下。 new Model({id: '1'}).fetch({withRelated: [relations...]})
應該很好地工作。
這裡的問題是,Bookshelf使用的數據庫抽象層KNEX使用連接池,從而使數據庫連接保持打開狀態。如果您希望在腳本完成後退出過程,則必須在Bookshelf
實例的knex
屬性或在初始化期間通過的Knex
實例上致電.destroy(cb)
。有關連接池的更多信息,請參見KNEX文檔。
如果您通過debug: true
到knex
初始化調用,則可以看到所有的查詢呼叫。您還可以將相同的選項傳遞給訪問數據庫的所有方法,例如model.fetch()
或model.destroy()
。示例:
// Turning on debug mode for all queries
const knex = require ( 'knex' ) ( {
debug : true ,
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Debugging a single query
new User ( { id : 1 } ) . fetch ( { debug : true , withRelated : [ 'posts.tags' ] } ) . then ( user => {
// ...
} )
有時,您需要進一步深入研究各種呼叫,並查看幕後一切。您可以使用Node-inspector,它允許您像在瀏覽器中一樣使用debugger
語句調試代碼。
書架使用自己的bluebird
諾言庫的副本。您可以在此處閱讀有關調試承諾的更多信息。
在您的應用程序代碼開始時添加以下塊將捕獲任何其他錯誤的錯誤鍊鍊處理程序,這在調試中非常有幫助:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
請參閱Github上的貢獻文件。
儘管它主要針對node.js,但所有依賴項都是兼容的,並且可以通過提供自定義的KNEX適配器來適應其他支持SQLITE3數據庫的JavaScript環境。不存在這樣的適配器。
我們使用書架找到了以下項目,但可能還有更多: