MENU

NodeORM 数据库插件 Sequelize 基本使用

• March 18, 2023 • Read: 311 • Web Program

Sequelize 是一个基于 Node.js 的 ORM(Object-Relational Mapping)框架,可以与多种数据库进行交互,如 MySQL、PostgreSQL、SQLite 等。它的使用简单,支持多种数据库操作,并且可以轻松地进行数据迁移。

本篇博文将介绍如何在 Node.js 环境下使用 Sequelize 进行数据库操作,包括创建表、增删改查等基本操作。

安装 Sequelize

在使用 Sequelize 之前,需要先安装它及其对应的数据库驱动程序。

npm install sequelize mysql2

其中,mysql2 是 Sequelize 的 MySQL 驱动程序,可以根据实际需求选择对应的驱动程序。

连接数据库

首先需要创建一个 Sequelize 实例,用于连接数据库。可以通过以下代码进行创建:

const Sequelize = require('sequelize');
​
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql',
  logging: false,
});

上述代码中,databaseusernamepassword 分别为数据库的名称、用户名和密码。host 表示数据库的主机地址,dialect 则表示使用的数据库类型。

定义模型

在 Sequelize 中,一个表对应一个模型。定义模型的方式如下:

const { DataTypes } = require('sequelize');
​
const User = sequelize.define('User', {
  username: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  },
  password: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

上述代码中,定义了一个名为 User 的模型,包含了三个属性:usernameemailpassword。其中,type 表示属性的类型,allowNull 表示该属性是否允许为空,unique 则表示该属性是否唯一。

同步数据库

在定义完模型后,需要通过以下代码将模型同步到数据库中:

sequelize.sync();

如果需要将模型同步到指定的数据表中,可以在定义模型时指定表名:

const User = sequelize.define('user', {...}, { tableName: 'users' });

增删改查

创建记录

创建记录有两种方式,一种是使用 create 方法,另一种是使用 build 方法,后者只是将要创建的实例对象保存在内存中,需要使用 save 方法将其持久化到数据库中。

// 创建一条新记录
const user = await User.create({
  name: 'John Doe',
  email: 'john.doe@example.com'
});
​
// 创建一条新记录,但不保存到数据库中
const user = User.build({
  name: 'John Doe',
  email: 'john.doe@example.com'
});
await user.save();

查询记录

查询记录有多种方式,可以使用 findAll 方法查询所有记录,使用 findOne 方法查询单条记录,使用 findByPk 方法根据主键查询记录,还可以使用 findAll 方法的选项参数进行条件查询、排序、分页等。

const users = await User.findAll();
​
// 根据主键查询记录
const user = await User.findByPk(1);
​
// 条件查询
const users = await User.findAll({
  where: {
    name: 'John Doe'
  },
  order: [
    ['created_at', 'DESC']
  ],
  limit: 10,
  offset: 0
});

更新记录

使用 update 方法更新记录。

// 更新一条记录
await User.update({
  name: 'Jane Doe'
}, {
  where: {
    id: 1
  }
});

删除记录

使用 destroy 方法删除记录。

// 删除一条记录
await User.destroy({
  where: {
    id: 1
  }
});

创建一个主键为 id 自增的表

const { Sequelize, DataTypes } = require('sequelize');

// 创建 Sequelize 实例
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

// 定义数据表模型
const User = sequelize.define('user', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false
  }
});

// 同步数据表结构
sequelize.sync();

需要注意的是,调用 sync() 方法只会在数据库中创建不存在的数据表,已存在的数据表不会受到影响。如果需要修改数据表结构,需要使用数据库迁移工具,例如 Sequelize 提供的 sequelize-cli 命令行工具。

事务处理机制

const { Sequelize, DataTypes } = require('sequelize');

// 创建 Sequelize 实例
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

// 定义数据表模型
const User = sequelize.define('user', {
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false
  },
  balance: {
    type: DataTypes.FLOAT,
    defaultValue: 0
  }
});

// 事务处理
sequelize.transaction(async (t) => {
  // 在事务中创建一个用户
  const user = await User.create({
    name: 'Alice',
    email: 'alice@example.com'
  }, { transaction: t });

  // 在事务中修改用户余额
  user.balance += 100;
  await user.save({ transaction: t });
}).then(() => {
  console.log('Transaction has been committed');
}).catch((err) => {
  console.error('Transaction has been rolled back', err);
});

在上面的代码中,首先使用 sequelize.transaction() 方法开启一个事务,该方法接受一个回调函数作为参数,回调函数中执行所有需要在事务中处理的操作。

在回调函数中,首先使用 User.create() 方法创建一个用户,并且将事务对象 t 作为选项传入,表示该操作属于当前事务。

接着,修改用户余额,并且使用 user.save() 方法保存修改,同样将事务对象 t 作为选项传入。

如果在事务中的任意一个操作失败,事务会自动回滚,并且抛出一个异常。如果所有操作都成功,则会自动提交事务。

需要注意的是,在开启事务时需要使用 await 或者 then() 等待事务结束后再处理事务的结果。

总结

本文介绍了如何使用 Sequelize 在 Node.js 环境下操作数据库,包括创建数据表、增删改查等基本操作。可以根据具体需求进行使用。

Archives QR Code
QR Code for this page
Tipping QR Code