注意:本文所有的代码实例都是运行在 express + mysql 的环境下。
前言
Knex是一个用于Node.js的SQL查询构建器和查询执行器。它提供了一种简洁、流畅的方式来编写和执行SQL查询,同时允许开发人员使用数据库的不同方言和特定功能。
Knex支持多种流行的关系型数据库,如MySQL、PostgreSQL、SQLite和Oracle等。它提供了一套API,用于构建和执行复杂的SQL查询,包括选择、插入、更新和删除等操作。开发人员可以使用链式调用来构建查询,通过方法调用来指定查询的条件、排序、限制和连接等。
除了查询构建功能,Knex还提供了一些其他有用的特性,如事务支持、数据库迁移管理以及与异步流程的集成等。它还可以与许多流行的Node.js框架和工具进行集成,如Express、Koa和Bookshelf等。
快速开始
安装
# 安装 knex
npm install knex
# 安装 mysql数据库驱动
npm install mysql2
配置
在 src/config/dbConfig.js
文件下新建 Knex
配置文件,内容如下:
module.exports = {
development: {
client: 'mysql2',
connection: {
host: 'localhost',
user: 'root',
password: '123456',
database: 'knex_db'
}
},
production: {
...
}
};
在 src/app.js
文件中引入 dbConfig.js
配置,代码如下:
const express = require('express');
const knex = require('knex');
const dbConfig = require('./config/dbConfig.js');
const app = express();
// 根据配置创建一个 Knex 实例
const db = knex(dbConfig.development);
// 示例路由处理程序
app.get('/users', (req, res) => {
// 使用 Knex 进行查询
db.select('*').from('users')
.then(users => {
res.json(users);
})
.catch(error => {
res.status(500).json({ error: 'An error occurred' });
});
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
以上就是 Knex
的配置和最简单实用。
Schema 模式
在 Knex
中,"schema" 是指用于定义和管理数据库表结构的功能。
Knex
的 schema
功能提供了一组方法,用于创建和修改数据库表、列、约束等元数据。
Knex
的 schema
提供主要功能:
- 创建表和列:你可以使用 Knex 创建新的数据库表,并定义表中的列及其数据类型、长度、约束等信息。
- 修改表结构:Knex 允许你对已存在的表进行修改,包括添加、修改或删除列,更改列的数据类型、长度和约束等。
- 创建和管理索引:你可以使用 Knex 在表上创建索引,以提高查询性能。
- 创建和管理约束:Knex 提供了创建和管理约束的方法,如主键约束、唯一约束、外键约束等。
- 数据库迁移:Knex 的 schema 功能与数据库迁移密切相关。你可以使用 Knex 迁移工具来管理数据库的版本控制和迁移脚本,以便在不同环境中保持数据库结构的一致性和可迁移性。
Knex
的 schema
功能提供的相当完善,有兴趣的可以自行到官网查阅,这里只做几个简单的演示。
官网地址:knexjs.org/guide/schem…
创建表
下面我们将使用 knex
的 schema
创建一个数据表,表的名称是 users
,有4个字段:id、name、email以及隐式时间戳「created_at、updated_at」这两个字段。
其中主键是 id 字段并且引入调用了primary()函数,会自动开启自增长功能。email自动被设置了唯一性并且不能为空,name字段不能为空。
const kenx = require('kenx');
const dbConfig = require('./config/dbConfig.js');
const db = knex(dbConfig.development);
// 创建表
db.schema.createTable('users', table => {
table.increments('id').primary();
table.string('name', 255).notNullable();
table.string('email', 255).unique().notNullable();
table.timestamps(true, true);
}).then(() => {
console.log('Table created successfully');
}).catch(error => {
console.error('Error creating table:', error.message);
});
Knex 提供的字段类型函数如下:
创建索引和约束
// 创建索引
db.schema.alterTable('users', table => {
table.index('email');
}).then(() => {
console.log('Index created successfully');
}).catch(error => {
console.error('Error creating table:', error.message);
})
// 创建约束
db.schema.alterTable('users', table => {
table.unique('email');
})
.then(() => {
console.log('Constraint created successfully');
})
.catch(error => {
console.error('Error creating constraint:', error.message);
})
删除表
// 删除表
async function dropTable(tableName) {
try {
await db.schema.dropTableIfExists(tableName);
console.log('table dropped successfully.');
} catch (error) {
console.error('table drop failed: ', error.message);
}
}
// 调用删除 users 表
dropTable('users');
总结
Knex是一个强大而灵活的SQL查询构建器,使开发人员可以以一种简单、一致的方式与不同的关系型数据库进行交互。它简化了数据库查询的编写和执行过程,提供了更高层次的抽象,同时保留了灵活性和可扩展性。
本文简单演示了Knex的安装和Schema的使用,欢迎评论区交流。