基于性能、稳定性和 ES8+ 支持的 Knex 与 mysql2
Knex vs. mysql2 based on performance, stability, and ES8+ support
是否有人对这两个 DB 库都有实际操作经验 — knex
vs. mysql2
?
经过一些谷歌搜索(例如在 NPMCompare),我仍然很想知道,根据实际经验,这两种选择的优缺点是什么?
到目前为止,使用 knex
over mysql2
, that I clearly see, is its universal support of MSSQL, MySQL, PostgreSQL, SQLite3, and Oracle, while the latter supports MySQL only, but since currently I'm focusing on MySQL only, this knex
功能的唯一真正优势似乎不太相关。
我会考虑的参数:
- 性能&负载电阻;
- 稳定性(生产就绪);
- 原生 ES8+ 支持(无回调地狱,无额外
Util.promisify
wrappers, ESM/MJS 支持);
- 简短明了,越不冗长越好。
我在我的主要项目中使用 knex,我认为您正在尝试比较苹果和橙子,因为 Knex 是一个查询生成器,它使用 (mysql2) 作为传输库(在MySql 用法的情况)。
我在 Knex 中看到的好处是:
- 通过默认值阻止SQL注入。
- 让您 构建查询 非常轻松,无需太多努力
- 让您可以像编写 javascript 函数一样编写查询(我认为这是一个很大的优势)。
因为在我看来#3 是一个如此大的优势,所以最好证明它:
认为您有 2 个端点
/users/list
- 假设 return 用户列表 ({id, name}
)
/users/:id
- 假设 return 具有 相同 结构的单个用户。
你可以这样实现。
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 和回调,所以你可以选择适合你的。
我使用的其他很酷的功能是在大小写之间自动转换,我的数据库对于表和列名称具有蛇形大小写样式,但在我的节点中,我使用驼峰大小写,使用 knex-stringcase 插件。
Migrations,允许您定义如何使用代码构建/升级您的架构,这可以帮助您从 CI.
自动更新您的生产架构
Mysql2是DB之上的低级驱动。
是否有人对这两个 DB 库都有实际操作经验 — knex
vs. mysql2
?
经过一些谷歌搜索(例如在 NPMCompare),我仍然很想知道,根据实际经验,这两种选择的优缺点是什么?
到目前为止,使用 knex
over mysql2
, that I clearly see, is its universal support of MSSQL, MySQL, PostgreSQL, SQLite3, and Oracle, while the latter supports MySQL only, but since currently I'm focusing on MySQL only, this knex
功能的唯一真正优势似乎不太相关。
我会考虑的参数:
- 性能&负载电阻;
- 稳定性(生产就绪);
- 原生 ES8+ 支持(无回调地狱,无额外
Util.promisify
wrappers, ESM/MJS 支持); - 简短明了,越不冗长越好。
我在我的主要项目中使用 knex,我认为您正在尝试比较苹果和橙子,因为 Knex 是一个查询生成器,它使用 (mysql2) 作为传输库(在MySql 用法的情况)。
我在 Knex 中看到的好处是:
- 通过默认值阻止SQL注入。
- 让您 构建查询 非常轻松,无需太多努力
- 让您可以像编写 javascript 函数一样编写查询(我认为这是一个很大的优势)。
因为在我看来#3 是一个如此大的优势,所以最好证明它:
认为您有 2 个端点
/users/list
- 假设 return 用户列表 ({id, name}
)/users/:id
- 假设 return 具有 相同 结构的单个用户。
你可以这样实现。
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 和回调,所以你可以选择适合你的。
我使用的其他很酷的功能是在大小写之间自动转换,我的数据库对于表和列名称具有蛇形大小写样式,但在我的节点中,我使用驼峰大小写,使用 knex-stringcase 插件。
Migrations,允许您定义如何使用代码构建/升级您的架构,这可以帮助您从 CI.
自动更新您的生产架构Mysql2是DB之上的低级驱动。