node.js - 基于性能、稳定性和 ES8+ 支持的 Knex 与 mysql2

标签 node.js orm database-connection knex.js node-mysql2

是否有人对这两个 DB 库都有实际操作经验 — knexmysql2

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

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

我会考虑的参数:

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

最佳答案

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

我在 Knex 中看到的好处是:

  1. 默认防止 SQL 注入(inject)。
  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);
}

看看 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.

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

从 ES6 开始,Knex 默认支持 Promises 和回调,所以你可以选择适合你的。

我使用的其他很酷的功能是在大小写之间自动转换,我的数据库对于表和列名称具有蛇形大小写样式,但在我的 Node 中我使用驼峰大小写,使用 knex-stringcase插件。

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

Mysql2 是数据库之上的底层驱动。

关于node.js - 基于性能、稳定性和 ES8+ 支持的 Knex 与 mysql2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61539813/

相关文章:

javascript - 在 D3.js 中不渲染图形的情况下更改 Node 的标签数据

node.js - 测试函数时替换变量的值

php - 未找到 Doctrine 映射案例

Symfony2 Doctrine,设置一个多对多自引用关系的页面

sql - 如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?

java - 使用 Java 读取 FoxPro 2.6 数据

javascript - NodeJS "this"空对象

node.js - 在expressjs 4.x中将less文件编译为css

python - sqlalchemy 标量查询问题?

mysql - 如何存储mysql连接字符串