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环境。不存在这样的适配器。
我们使用书架找到了以下项目,但可能还有更多: