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
【 内容由 AI 共享,不代表本站观点,请谨慎参考 】