• home > webfront > ECMAS > nodejs >

    nodejs连接数据:mysql/mysql2/Knex.js/Sequelize库区别

    Author:zhoulujun Date:

    MySQL2 模块是由官方提供的,有官方库当然一统官方。Knex js vs Sequelize 是不是和java里面的 mybatis vs hibernate 的区别?之前润出去的前同事现在都在搞 Hibernate,我们这些苦逼还在 天天用MyBatis 被产品经理与老板们鞭挞。

    在 Node.js 中,有几个库可以用来连接和操作 MySQL 数据库,其中最常用的是 mysql 和 mysql2。如果不止连接mysql,推荐你使用 knex.js 或 sequelize。

    mysql vs mysql2

    Node.js MySQL 和 MySQL2 是两个不同的 Node.js 模块,用于在 Node.js 中连接和操作 MySQL 数据库。

    • MySQL 模块是一个第三方模块,提供了简单易用的 API 来连接和操作 MySQL 数据库。它支持连接池、事务等功能。

    • MySQL2 模块是由官方提供的,与 Node.js MySQL 模块类似,也用于连接和操作 MySQL 数据库。 MySQL2 支持最新的 MySQL 版本,并提供了更高效的性能、更丰富的功能以及更好的兼容性。

    看npm包搜索,就知道区别了
    image.png

    之前使用mysql库,是没有办法。现在官方有了,还是用官方的。

    MySQL2的历史以及选择原因

    看官方回答:

    MySQL2 项目是 MySQL-Native 的延续。 协议解析器代码从头开始重写,api 更改为匹配流行的 mysqljs/mysql。 MySQL2 团队正在与 mysqljs/mysql 团队合作,将共享代码分解并移至 mysqljs 组织下。

    MySQL2 大部分 API 与 mysqljs 兼容,并支持大部分功能。 MySQL2 还提供了更多的附加功能:

    MySQL2  需要注意的是:SQL预处理的使用、连接池的使用

    mysql.createConnection vs mysql.createPool 

    mysql.createConnection 和 mysql.createPool 是 Node.js 中 mysql 库提供的两种不同的连接方式。它们之间的主要区别在于连接管理和性能。

    mysql.createConnection:

    mysql.createConnection 创建一个到 MySQL 数据库的单个连接。每次调用此方法时,都会创建一个新的连接。当你完成查询后,需要手动关闭连接,以避免资源泄漏。这种方式适用于只需要执行少量查询的简单场景。

    mysql.createPool:

    mysql.createPool 创建一个连接池,它可以管理多个到 MySQL 数据库的连接。连接池在创建时会预先建立一定数量的连接,并在需要时自动分配和回收连接。这种方式在处理大量并发查询时具有更好的性能,因为它可以重用已经建立的连接,而不是为每个查询创建新的连接。

    当使用 mysql.createPool 创建连接池后,你可以使用 pool.query 方法执行查询。在查询完成后,连接会自动返回到连接池,无需手动释放。这是连接池的一个优势,因为它可以自动管理连接的生命周期,减少了手动管理连接的复杂性。




    Knex.js VS Sequelize

    Knex.js 和 Sequelize 都是用于连接和操作 MySQL 数据库的 Node.js 库,但它们之间有一些关键区别。

    如果有java基础,想想: Knex.js vs Sequelize 是不是和java里面的 mybatis vs hibernate 的区别?

    Knex.js 和 Sequelize 与 Java 里面的 MyBatis 和 Hibernate 之间的区别有一定的相似性。这两对库都分别代表了查询构建器(Query Builder)和对象关系映射(Object-Relational Mapping,ORM)两种不同的数据库访问范式。

    Knex.js vs MyBatis:

    Knex.js(Node.js)和 MyBatis(Java)都是查询构建器。它们允许你编写 SQL 查询并将结果映射到对象。这两个库都提供了一定程度的抽象,但仍然保留了对 SQL 查询的直接控制。这使得它们在某些情况下更灵活,但可能需要更多的手动编码。

    Sequelize vs Hibernate:

    Sequelize(Node.js)和 Hibernate(Java)都是 ORM 库。它们提供了更高级别的抽象,允许你通过操作对象和类来访问和操作数据库,而无需直接编写 SQL 查询。这些库通常提供了丰富的功能,如模型定义、关联、事务等。这使得它们在处理复杂的数据模型和业务逻辑时更方便,但可能需要更多的配置和学习成本。

    总之,Knex.js 和 MyBatis 以及 Sequelize 和 Hibernate 之间的区别类似,分别代表了查询构建器和 ORM 两种不同的数据库访问范式。你可以根据你的需求和喜好来选择合适的库。

    之前润出去的前同事现在都在搞 Hibernate,我们这些苦逼还在 天天用MyBatis 被产品经理与老板们鞭挞——手动狗头吐槽(像我java转Android,再到h5,前端,真的越来越苦B)。

    下面是一个简单的比较,以及如何使用它们连接到 MySQL 数据库的示例。

    Sequelize 示例:

    sequelize.js 配置文件:

    const { Sequelize } = require('sequelize');
    
    const sequelize = new Sequelize('your_database', 'root', 'your_password', {
      host: 'localhost',
      dialect: 'mysql'
    });
    
    module.exports = sequelize;

    定义一个模型(例如 User):

    const { DataTypes } = require('sequelize');
    const sequelize = require('./sequelize');
    
    const User = sequelize.define('User', {
      id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: DataTypes.STRING
      }
    }, {
      tableName: 'users',
      timestamps: false
    });
    
    module.exports = User;

    使用 Sequelize 连接到数据库并执行查询:

    const User = require('./User');
    
    async function getUsers() {
      const users = await User.findAll();
      console.log(users.map(user => user.toJSON()));
    }
    
    getUsers();

    对应国内老板们的“敏捷开发(排大腿排期)”,这个写法头发会更少

    Knex.js 示例:

    knexfile.js 配置文件:

    module.exports = {
      client: 'mysql',
      connection: {
        host: 'localhost',
        user: 'root',
        password: 'your_password',
        database: 'your_database'
      }
    };

    使用 Knex.js 连接到数据库并执行查询:

    const knex = require('knex')(require('./knexfile'));
    
    async function getUsers() {
      const users = await knex('users').select('*');
      console.log(users);
    }
    
    getUsers();

    像我就直接哟个mysql2了。



    转载本站文章《nodejs连接数据:mysql/mysql2/Knex.js/Sequelize库区别》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/JS-Server/8965.html