本篇博文将介绍如何在 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,
});
上述代码中,database
、username
、password
分别为数据库的名称、用户名和密码。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
的模型,包含了三个属性:username
、email
和 password
。其中,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);
});
在回调函数中,首先使用 User.create() 方法创建一个用户,并且将事务对象 t 作为选项传入,表示该操作属于当前事务。
接着,修改用户余额,并且使用 user.save() 方法保存修改,同样将事务对象 t 作为选项传入。
如果在事务中的任意一个操作失败,事务会自动回滚,并且抛出一个异常。如果所有操作都成功,则会自动提交事务。
需要注意的是,在开启事务时需要使用 await 或者 then() 等待事务结束后再处理事务的结果。
总结
本文介绍了如何使用 Sequelize 在 Node.js 环境下操作数据库,包括创建数据表、增删改查等基本操作。可以根据具体需求进行使用。