BookShelf는 Knex SQL Query Builder에 구축 된 Node.js 용 JavaScript ORM입니다. 약속 기반 및 전통적인 콜백 인터페이스, 트랜잭션 지원, 열렬한/중첩성 관계 로딩, 다형성 연관성, 일대일, 일대일 및 다수의 관계에 대한 지원을 특징으로합니다.
PostgreSQL, MySQL 및 SQLite3과 함께 작동하도록 설계되었습니다.
웹 사이트 및 문서. 이 프로젝트는 GitHub에서 주최되며 포괄적 인 테스트 스위트가 있습니다.
BookShelf는 JavaScript에서 데이터베이스를 쿼리 할 때 일반적인 작업에 대한 간단한 라이브러리를 제공하고 이러한 객체간에 관계를 형성하여 데이터 매퍼 패턴에서 많은 아이디어를 가져옵니다.
간결하고 문맹 코드베이스를 사용하면 BookShelf는 읽고 이해하고 확장하기가 간단합니다. 특정 유효성 검사 체계를 사용하도록 강요하지 않으며 유연하고 효율적인 관계/중첩 관련 하중 및 일류 거래 지원을 제공합니다.
마른 개체 관계 매퍼로, 주식 컨벤션에 맞지 않는 사용자 정의 쿼리가 필요할 때마다 원시 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
BookShelf 라이브러리는 초기화 된 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 메소드를위한 대안.도서관에 대해 궁금한 점이 있습니까? Knex.js 및 Bookshelf.js에서 지원하기 위해 #BookShelf Freenode IRC 채널에 참여하거나 Stack Overflow에 문제를 게시하십시오.
책장에 기여하려면 일반적으로 문제를보고하거나 풀 수십을 제출하려고합니다. 이 목적으로 온라인 저장소는 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
문으로 코드를 디버그 할 수 있습니다.
BookShelf는 자체 bluebird
Promise Library 사본을 사용합니다. 디버깅 약속에 대한 자세한 내용은 여기에서 읽을 수 있습니다.
애플리케이션 코드 시작시 다음 블록을 추가하면 일반 약속 체인 핸들러에서 달리 잡을 수없는 오류가 발생합니다. 이는 디버깅에 매우 도움이됩니다.
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Github의 기고 문서를 참조하십시오.
주로 Node.js를 대상으로하지만 모든 종속성은 브라우저 호환이며 사용자 정의 KNEX 어댑터를 제공하여 SQLITE3 데이터베이스를 지원하는 다른 JavaScript 환경과 함께 작동하도록 조정할 수 있습니다. 그래도 그러한 어댑터는 존재하지 않습니다.
BookShelf를 사용하여 다음 프로젝트를 찾았지만 더 많은 것이있을 수 있습니다.