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