Knex.js使用心得
Author:zhoulujun Date:
上篇《nodejs连接数据:mysql/mysql2/Knex.js/Sequelize库区别》,介绍个Knex.js,这篇来说下使用心得
Knex.js (发音为 /kəˈnɛks/)是一个功能齐全的 SQL 查询构造器(query builder),支持 PostgreSQL、CockroachDB、MSSQL、MySQL、MariaDB、SQLite3、Better-SQLite3、Oracle 和 Amazon Redshift 等数据库,它的设计宗旨是灵活、便于移植且使用方便。
由于 Node.js 没有提供像 java 中的 JDBC 这样的数据库访问抽象层,导致基于原生的 Node.js 进行数据库编程时,需要面向不同的数据库类型提供的底层 SDK 编程,学习成本高、不可移植。
Knex 建立在底层数据库提供的 SDK 之上,提供统一的 API 数据库接口,可以将其看成是 Node.js 中类似"JDBC"的存在,代码与底层数据库耦合弱,方便在数据库之间迁移(如本地开发测试用 sqlite3,线上用MySQL),无需学习 SQL 方言。
性能:Knex.js的性能可能不如原生的SQL查询,因为它需要将查询构建器转换为SQL查询语句,这可能会导致一些性能损失。
限制:Knex.js的查询构建器可能无法满足所有的查询需求,因为它是基于一组预定义的API构建的,而不是原生的SQL查询语句。
对于追求高性能和自由性的场景,使用原生 SQL 替代即可
knex.raw('SELECT * FROM users WHERE name = ?', ['John']).then((rows) => { console.log(rows); }).catch((err) => { console.error(err); });使用raw方法可以执行原始的 SQL 查询,当预设的 API 无法满足需求时,作为兜底的手段。
最方便的是,Knex.js 提供了数据库工具,使用 Knex.js API 编写好数据库迁移脚本后,交给 Knex.js cli 执行,可以方便地在不同数据库之间迁移数据。
具体使用层面,可以看https://knex.nodejs.cn/guide/transactions.html
Objection.js
Objection.js 是一个构建在 Knex.js 之上的 ORM(对象关系映射)工具,它为 Node.js 和 TypeScript 应用程序提供了许多优势。
用法
如在 models 目录下创建模型类。每个模型对应于数据库中的一个表。
// models/Author.js const { Model } = require('objection'); class Author extends Model { static get tableName() { return 'authors'; } // Define the relationship to Book model. static get relationMappings() { const Book = require('./Book'); return { books: { relation: Model.HasManyRelation, modelClass: Book, join: { from: 'authors.id', to: 'books.author_id' } } }; } } module.exports = Author;
Book Model
// models/Book.js const { Model } = require('objection'); class Book extends Model { static get tableName() { return 'books'; } // Define the relationship to Author model. static get relationMappings() { const Author = require('./Author'); return { author: { relation: Model.BelongsToOneRelation, modelClass: Author, join: { from: 'books.author_id', to: 'authors.id' } } }; } } module.exports = Book;
现在我们可以开始执行查询了。以下是一些基本的例子:
async function fetchData() { // Fetch all authors with their books. const authorsWithBooks = await Author.query() .withGraphFetched('books'); console.log(authorsWithBooks); // Fetch a specific book along with its author. const bookWithAuthor = await Book.query() .findById(1) .withGraphFetched('author'); console.log(bookWithAuthor); } fetchData().catch(console.error);
这些看官方文档即可:https://vincit.github.io/objection.js/api/objection/#model
Objection.js 支持多种插件,例如 objection-soft-delete 提供软删除功能,objection-graphql 自动生成 GraphQL 模式等。
转载本站文章《Knex.js使用心得》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/JS-Server/9279.html