Knex vs. mysql2 基于性能、稳定性和 ES8+ 支持

Mik*_* B. 2 orm database-connection node.js knex.js node-mysql2

没有任何人有一个动手既DB-库经验-knex主场迎战mysql2

经过一些谷歌搜索(例如在NPMCompare),我仍然很想知道,根据实际经验,这两种选择的优缺点是什么?

到目前为止,我清楚地看到使用knexover的唯一真正优势mysql2是它对 MSSQL、MySQL、PostgreSQL、SQLite3 和 Oracle 的普遍支持,而后者仅支持 MySQL,但由于目前我只关注 MySQL, thisknex的功能似乎不太相关。

我会考虑的参数:

  • 性能和负载电阻;
  • 稳定性(生产就绪);
  • 原生 ES8+ 支持(无回调、无额外Util.promisify包装、ESM/MJS支持);
  • 简短明了,越少越好。

fel*_*osh 5

我在我的主要项目中使用 knex,我认为您正在尝试将苹果与橙子进行比较,因为 Knex 是一个查询构建器,它下划线使用 (mysql2) 作为传输库(在使用 MySql 的情况下)。

我在 Knex 中看到的好处是:

  1. 默认情况下防止 SQL 注入。
  2. 让您真正轻松地构建查询,而无需付出太多努力
  3. 让您可以像编写 javascript 函数一样编写查询(在我看来,这是一个很大的优势)。

由于#3 在我看来是一个如此大的优势,最好证明它:

认为你有 2 个端点

  1. /users/list- 假设返回用户列表 ( {id, name})
  2. /users/:id- 假设返回具有相同结构的单个用户。

你可以像这样实现它。

async function getAllUsers() {
  return db('users').columns('id', 'name'); //think that this can consist of many joins
}

async function getUserById(userId) {
  return getAllUsers().where('id', userId);
}
Run Code Online (Sandbox Code Playgroud)

看看如何getUserById重用相同的查询(可能真的很复杂),并且只是“添加”它所需的限制。

性能方面,我不认为这种抽象有很大的成本,(我还没有注意到任何性能问题)

我不确定你所说的稳定性是什么,但 Knex 有一个非常酷的 TS 支持,它可以使你的查询强类型化。

interface User {
  id: number;
  name: string;
}

const users = await db<User>('users').columns('id', 'name'); // it will autocomplete the columns names & users will be of type User[] automatically.
Run Code Online (Sandbox Code Playgroud)

结合使用@typed-code/schemats从数据库自动生成这些数据库类型,它使工作和重构变得更好。

从 ES6 开始,Knex 默认支持 Promise 和回调,因此您可以选择适合您的任何东西。

我正在使用的其他很酷的功能是在案例之间自动转换,我的数据库有一个蛇形大小写样式作为表和列名称,但在我的节点中,我使用驼峰式大小写,使用knex-stringcase插件。

Migrations,允许您定义如何使用代码构建/升级您的架构,这可以帮助您从 CI 自动更新您的生产架构。

Mysql2 是数据库之上的低级驱动程序。