Das Bookshelf ist ein JavaScript -ORM für Node.js, der auf dem Knex SQL Query Builder basiert. Es bietet sowohl vielversprechende als auch traditionelle Rückrufschnittstellen, Transaktionsunterstützung, Eier-/verschachtelte Beziehungsbelastung, polymorphe Assoziationen und Unterstützung für Einzel-, Eins-zu-Viele-Beziehungen und viele zu viele Beziehungen.
Es ist so konzipiert, dass es mit Postgresql, MySQL und SQLite3 funktioniert.
Website und Dokumentation. Das Projekt wird auf Github gehostet und verfügt über eine umfassende Testsuite.
Das Bücherregal zielt darauf ab, eine einfache Bibliothek für gemeinsame Aufgaben bereitzustellen, wenn Datenbanken in JavaScript abfragen und Beziehungen zwischen diesen Objekten aufgebaut und viele Ideen aus dem Data Mapper -Muster entnehmen.
Mit einem kurzen, gebildeten Codebasis ist ein Bücherregal einfach zu lesen, zu verstehen und zu erweitern. Es zwingt Sie nicht dazu, ein bestimmtes Validierungsschema zu verwenden, und bietet eine flexible, effiziente Beziehung/Verschachtelbeziehungsbelastung und erstklassige Transaktionsunterstützung.
Es ist ein magerer Objekt-Relational-Mapper, der es Ihnen ermöglicht, zur Schnittstelle zwischen RAW KNEX zu fallen, wenn Sie eine benutzerdefinierte Abfrage benötigen, die nicht ganz zu den Aktienkonventionen passt.
Sie müssen eine Kopie von Knex und entweder mysql
, pg
oder sqlite3
von NPM installieren.
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
Die Bücherregalbibliothek wird durch Übergabe einer initialisierten Knex -Client -Instanz initialisiert. Die Knex -Dokumentation enthält eine Reihe von Beispielen für verschiedene Datenbanken.
// 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'
} )
Diese Initialisierung sollte wahrscheinlich nur einmal in Ihrer Bewerbung auftreten. Wenn Sie einen Verbindungspool für die aktuelle Datenbank erstellen, sollten Sie die in Ihrer gesamte Bibliothek zurückgegebene bookshelf
verwenden. Sie müssen diese Instanz speichern, die von der Initialisierung irgendwo in der Anwendung erstellt wurde, damit Sie sie verweisen können. Ein gemeinsames Muster besteht darin, den Client in einem Modul zu initialisieren, damit Sie es leicht verweisen können:
// 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' , {
// ...
} )
Hier ist ein Beispiel, um Ihnen den Einstieg zu erleichtern:
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
, Hinzufügen von Zeitstempeln, Attributvalidierung und einigen nativen CRUD -Methoden.Fragen zur Bibliothek haben? Kommen Sie zu uns in den #Bookshelf Freenode IRC -Kanal, um sie auf Knex.js und bookshelf.js zu unterstützen, oder veröffentlichen Sie ein Problem auf dem Stapelüberlauf.
Wenn Sie zum Bücherregal beitragen möchten, möchten Sie normalerweise ein Problem melden oder eine Pull-Request einreichen. Zu diesem Zweck ist das Online -Repository auf GitHub verfügbar.
Für weitere Hilfe bei der Einrichtung Ihrer lokalen Entwicklungsumgebung oder des Erlernens, wie Sie zum Bücherregal beitragen können, sollten Sie das auf GitHub verfügbare Dokument lesen.
Ja, Sie können .asCallback(function(err, resp) {
auf einer beliebigen Datenbank -Betriebsmethode und verwenden Sie die Callback -Schnittstelle zwischen Standard- (err, result)
-Stil -Interface, falls Sie dies bevorzugen.
Überprüfen Sie, ob der Typ für die anfänglichen Parameter, die an das abgerufene anfängliche Modell übergeben sind, korrekt ist. Zum Beispiel new Model({id: '1'}).load([relations...])
gibt nicht das gleiche wie new Model({id: 1}).load([relations...])
- Hinweis Dass die ID in einem Fall eine Zeichenfolge ist und eine Zahl in der anderen. Dies kann ein häufiger Fehler sein, wenn die ID aus einem URL -Parameter abgerufen wird.
Dies ist nur ein Problem, wenn Sie bereit sind, Daten mit Last zu laden, ohne das ursprüngliche Modell zuerst abzurufen. new Model({id: '1'}).fetch({withRelated: [relations...]})
sollte einwandfrei funktionieren.
Das Problem hier ist, dass KNEX, die von Bookself verwendete Datenbankabstraktionsschicht, die Verbindungspooling verwendet und somit die Datenbankverbindung geöffnet hält. Wenn Sie möchten, dass Ihr Prozess nach Abschluss Ihres Skripts beendet wird, müssen Sie .destroy(cb)
auf der knex
-Eigenschaft Ihrer Bookshelf
oder auf der während der Initialisierung übergebenen Knex
-Instanz anrufen. Weitere Informationen zum Verbindungsbeamten finden Sie in den Knex -Dokumenten.
Wenn Sie debug: true
in das Optionsobjekt an Ihren knex
-Initialize -Anruf übergeben, können Sie alle Abfragenanrufe sehen. Sie können dieselbe Option auch an alle Methoden übergeben, die auf die Datenbank zugreifen, z. B. model.fetch()
oder model.destroy()
. Beispiele:
// 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 => {
// ...
} )
Manchmal müssen Sie ein bisschen weiter in die verschiedenen Anrufe eintauchen und sehen, was alles hinter den Kulissen vor sich geht. Sie können Node-Inspector verwenden, mit denen Sie den Code mit debugger
-Anweisungen wie im Browser debuggen.
Das Bücherregal verwendet eine eigene Kopie der bluebird
Promise Library. Weitere Informationen zu Debugging -Versprechen finden Sie hier.
Durch das Hinzufügen des folgenden Blocks zu Beginn Ihres Anwendungscodes werden Fehler aufgenommen, die nicht sonst nicht in den normalen Versprechenkettenhandlern gefangen sind, was beim Debuggen sehr hilfreich ist:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Siehe das beitragende Dokument zu GitHub.
Während es hauptsächlich auf node.js abzielt, sind alle Abhängigkeiten in Browser kompatibel und können so angepasst werden, dass sie mit anderen JavaScript -Umgebungen zusammenarbeiten, die eine SQLite3 -Datenbank unterstützen, indem sie einen benutzerdefinierten Knex -Adapter bereitstellen. Es gibt jedoch kein solcher Adapter.
Wir haben die folgenden Projekte mit einem Bücherregal gefunden, aber es kann mehr geben: