用途:Knex.js(v3.x)是 SQL 查询构建器而非 ORM,用链式 API 以更安全、可移植的方式编写 SQL,支持 PostgreSQL、MySQL、SQLite 和 MSSQL。适用于以编程方式构建查询、建表改表、管理迁移、填充开发/测试数据、包裹多表事务、编写参数化原生 SQL,以及分批插入大数据集。需要完整 ORM(模型关系、生命周期钩子、身份映射)或数据库特有功能未被抽象时,应改用其他方案,必要时用 knex.raw() 处理数据库特有语法。
主要能力:查询构建(select、where、join、orderBy、groupBy、having);insert/update/delete,PostgreSQL/MSSQL 可用 .returning()(MySQL/SQLite 上会静默忽略);Schema 构建(createTable、alterTable、列类型、索引、外键);迁移(knex migrate:make、up/down);种子(knex seed:make、seed:run);事务与隔离级别;带绑定的原生查询;子查询;batchInsert 分批插入;连接池调优;TypeScript 类型增强。
必要用法与关键约束:每个应用只初始化一次 knex 实例并复用,实例内部通过 tarn.js 管理连接池,建议 pool min: 0;创建多个指向同一数据库的实例会泄漏连接池。所有 knex.raw() 必须使用参数化绑定,? 为值、?? 为标识符,禁止字符串插值,否则会导致 SQL 注入。事务处理器内必须返回或 await promise,否则连接会一直挂起直至 acquireConnectionTimeout 触发。优雅关闭时调用 knex.destroy() 排空连接池,否则进程可能无法退出。Schema 变更应通过迁移完成,而非在应用代码中直接调用 knex.schema。生产查询避免 select("*");update 或 del 必须带 where 条件;PostgreSQL 插入忘记 .returning() 会返回空数组,需额外 SELECT;MySQL 上 .returning() 无效,应使用返回的 insertId。
限制与注意:Knex 具备方言感知但不隐藏差异,.returning() 仅适用于 PostgreSQL、MSSQL、SQLite 3.35+,MySQL 静默忽略;knex.raw() 在 PostgreSQL 返回 { rows, fields },在 MySQL 返回扁平数组;.timestamps(true, true) 创建 created_at/updated_at 但不会自动更新 updated_at;.first() 无匹配时返回 undefined;batchInsert 默认把所有分块包在单个事务中,一块失败全部回滚;.whereIn("id", []) 会生成 WHERE 1 = 0;迁移按文件名排序执行,需保持时间戳命名一致。收费、价格、平台等信息暂未提供。