O Bookshelf é um JavaScript ORM para Node.js, construído no Knex SQL Query Builder. Possui interfaces de retorno de chamada tradicionais e baseadas em promessas, suporte à transação, carregamento de relações ansiosas/aninhadas, associações polimórficas e suporte para relações individuais, um para muitos e muitos para muitos.
Ele foi projetado para funcionar com o PostgreSQL, MySQL e SQLite3.
Site e documentação. O projeto está hospedado no Github e possui um conjunto abrangente de testes.
A estante de livros pretende fornecer uma biblioteca simples para tarefas comuns ao consultar bancos de dados em JavaScript e formar relações entre esses objetos, pegando muitas idéias do padrão de mapeador de dados.
Com uma base de código concisa e alfabetizada, a estante é simples de ler, entender e estender. Ele não forçá você a usar nenhum esquema de validação específico e fornece uma relação de relação flexível e eficiente/carregamento de relação aninhada e suporte de transação de primeira classe.
É um mapeador de objetos magros, permitindo que você caia na interface Knex bruta sempre que precisar de uma consulta personalizada que não se encaixe bem nas convenções de estoque.
Você precisará instalar uma cópia do Knex e mysql
, pg
ou sqlite3
do NPM.
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
A biblioteca da estante é inicializada passando uma instância do cliente Knex inicializada. A documentação do Knex fornece vários exemplos para diferentes bancos de dados.
// 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'
} )
Essa inicialização provavelmente deve acontecer apenas uma vez em seu aplicativo. Como ele cria um pool de conexão para o banco de dados atual, você deve usar a instância bookshelf
retornada em toda a sua biblioteca. Você precisará armazenar esta instância criada pela inicialização em algum lugar do aplicativo para poder fazer referência a ele. Um padrão comum a seguir é inicializar o cliente em um módulo para que você possa fazer referência a ele facilmente mais tarde:
// 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' , {
// ...
} )
Aqui está um exemplo para você começar:
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()
em um modelo. Model
, adicionando registros de data e hora, validação de atributos e alguns métodos nativos de CRUD.Tem dúvidas sobre a biblioteca? Venha se juntar a nós no canal #bookshelf freeenode IRC para obter suporte no Knex.js e Bookshelf.js, ou publique um problema no Stack Overflow.
Se você deseja contribuir com a estante de livros, geralmente deseja relatar um problema ou enviar uma solicitação de tração. Para esse fim, o repositório on -line está disponível no Github.
Para obter ajuda adicional para configurar seu ambiente de desenvolvimento local ou aprender como você pode contribuir para a estante, você deve ler o documento contribuinte disponível no GitHub.
Sim, você pode chamar .asCallback(function(err, resp) {
em qualquer método de operação do banco de dados e usar a interface de retorno de chamada de estilo padrão (err, result)
se preferir.
Verifique se o tipo está correto para os parâmetros iniciais passados para o modelo inicial que está sendo buscado. Por exemplo new Model({id: '1'}).load([relations...])
não retornará o mesmo que new Model({id: 1}).load([relations...])
- Aviso que o ID é uma string em um caso e um número no outro. Isso pode ser um erro comum se a recuperação do ID de um parâmetro URL.
Este é apenas um problema se você estiver ansioso por carregar dados com carga sem primeiro buscar o modelo original. new Model({id: '1'}).fetch({withRelated: [relations...]})
deve funcionar bem.
O problema aqui é que a Knex, a camada de abstração do banco de dados usada pela estante de livros, usa o pool de conexões e, portanto, mantém a conexão do banco de dados aberta. Se você deseja que seu processo saia após o término do seu script, você precisará ligar para .destroy(cb)
na propriedade knex
de sua instância da Bookshelf
ou na instância Knex
passada durante a inicialização. Mais informações sobre o agrupamento de conexões podem ser encontradas nos documentos da Knex.
Se você passar debug: true
no objeto de opções para a sua chamada de inicialização knex
, poderá ver todas as chamadas de consulta que estão sendo feitas. Você também pode passar a mesma opção para todos os métodos que acessam o banco de dados, como model.fetch()
ou model.destroy()
. Exemplos:
// 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 => {
// ...
} )
Às vezes, você precisa mergulhar um pouco mais nas várias chamadas e ver o que está acontecendo nos bastidores. Você pode usar o inspetor de nó, o que permite depurar o código com instruções debugger
como faria no navegador.
A estante de livros usa sua própria cópia da biblioteca bluebird
Promise. Você pode ler aqui para saber mais sobre as promessas de depuração.
Adicionar o bloco a seguir no início do código do seu aplicativo capturará quaisquer erros não capturados nos manipuladores de cadeia de promessas normais, o que é muito útil na depuração:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Veja o documento contribuinte no Github.
Embora ele atinja principalmente o Node.js, todas as dependências são compatíveis com o navegador e podem ser adaptadas para trabalhar com outros ambientes JavaScript que suportam um banco de dados SQLITE3, fornecendo um adaptador Knex personalizado. No entanto, esse adaptador não existe.
Encontramos os seguintes projetos usando a estante de livros, mas pode haver mais: