• home > webfront > ECMAS > nodejs >

    Knex.js使用心得

    Author:zhoulujun Date:

    Knex 建立在底层数据库提供的 SDK 之上,提供统一的 API 数据库接口,方便在数据库之间迁移(如本地开发测试用 sqlite3,线上用MySQL),无需学习 SQL 方言。

    上篇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 方言。

    image.png

    • 性能: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