Node.js 中 Knex + MySQL2 的常用示例
Knex.js
是一个强大的 SQL 查询构建器,支持多种数据库,其中 mysql2
是一个高效的 MySQL 驱动程序。将两者搭配使用,能够高效、优雅地完成 MySQL 数据库操作。以下是 Knex
配置、常见操作(增删改查)的详细示例。
一、环境配置
1. 安装依赖
npm install knex mysql2
2. 配置 Knex
在项目中初始化 Knex,可以使用以下代码:
// knexfile.js
const knex = require('knex');
const db = knex({
client: 'mysql2',
connection: {
host: '127.0.0.1', // 数据库主机
user: 'root', // 数据库用户
password: '', // 数据库密码
database: 'example_db', // 数据库名称
},
});
module.exports = db;
然后在需要操作数据库的文件中引入:
const db = require('./knexfile');
二、基础操作
假设数据库中有一个 users
表,结构如下:
id (int) | name (varchar) | age (int) | email (varchar) |
---|
以下为增删改查的具体示例:
1. 插入数据(Insert)
async function addUser() {
const newUser = { name: 'Alice', age: 25, email: '[email protected]' };
const result = await db('users').insert(newUser);
console.log('Insert Result:', result); // 通常返回插入记录的 ID
}
addUser();
2. 查询数据(Select)
2.1 查询所有记录
async function getAllUsers() {
const users = await db('users').select('*');
console.log('All Users:', users);
}
getAllUsers();
2.2 查询特定条件的记录
async function getUsersByAge(age) {
const users = await db('users').where('age', '>', age).select('id', 'name');
console.log(`Users older than ${age}:`, users);
}
getUsersByAge(20);
2.3 分页查询
async function getPaginatedUsers(page, pageSize) {
const users = await db('users')
.select('*')
.limit(pageSize)
.offset((page - 1) * pageSize);
console.log(`Page ${page} Users:`, users);
}
getPaginatedUsers(1, 5);
3. 更新数据(Update)
async function updateUserEmail(id, newEmail) {
const result = await db('users').where('id', id).update({ email: newEmail });
console.log(`Updated Rows:`, result); // 返回受影响的行数
}
updateUserEmail(1, '[email protected]');
4. 删除数据(Delete)
async function deleteUser(id) {
const result = await db('users').where('id', id).del();
console.log(`Deleted Rows:`, result); // 返回受影响的行数
}
deleteUser(1);
三、进阶操作
1. 联合查询(Join)
async function getUsersWithPosts() {
const result = await db('users')
.join('posts', 'users.id', '=', 'posts.user_id')
.select('users.name', 'posts.title');
console.log('Users with Posts:', result);
}
getUsersWithPosts();
2. 事务处理(Transaction)
事务用于保证一组操作要么全部成功,要么全部回滚。
async function performTransaction() {
try {
await db.transaction(async (trx) => {
const userId = await trx('users').insert({ name: 'Bob', age: 30, email: '[email protected]' });
await trx('posts').insert({ user_id: userId[0], title: 'Hello World', content: 'This is a post.' });
});
console.log('Transaction committed successfully!');
} catch (err) {
console.error('Transaction failed, rolled back.', err);
}
}
performTransaction();
3. 原生 SQL 查询
async function rawQuery() {
const result = await db.raw('SELECT COUNT(*) as total FROM users');
console.log('Total Users:', result[0][0].total);
}
rawQuery();
四、总结
Knex.js
提供了:
- 灵活的查询构建器:避免了硬编码 SQL 的风险。
- 支持事务和连接池,适合中大型项目。
- 支持迁移工具,便于管理数据库结构。
更多高级功能如迁移、种子数据的使用,推荐查看 Knex 官方文档。
#全栈开发
分享于 2025-01-05