前言
Sequelize 是一个基于 Promise 的 Node.js ORM(对象关系映射)框架,它可以运行在多个数据库中,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server 等。在本文中,我们将重点介绍 Sequelize 在 MySQL 数据库中的使用。
准备工作
在开始使用 Sequelize 操作 MySQL 数据库之前,需要对数据表的设计进行规划,包括表的字段、类型和约束等。同时,也需要安装 MySQL 数据库和 Sequelize 模块。
安装 MySQL
可以通过 MySQL 官网下载和安装 MySQL Community Server,也可以使用 Docker 构建 MySQL 容器来运行 MySQL 服务器。在安装或配置 MySQL 完成后,可以启动 MySQL 服务器,并通过 MySQL 命令行客户端连接到 MySQL 服务器。
安装 Sequelize
使用 npm 命令安装 Sequelize 模块,可以使用 -g
参数全局安装,也可以在项目目录下局部安装。
npm install -g sequelize-cli npm install --save sequelize mysql2
创建 Sequelize 模型
在使用 Sequelize 进行 ORM 开发时,需要定义模型来描述数据表的结构和关系。可以使用 Sequelize CLI 命令行工具生成模型文件,也可以手动编写模型文件。
使用 Sequelize CLI 生成模型文件
使用 Sequelize CLI 命令行工具,可以方便地生成模型文件,并在生成过程中创建数据表。例如,要创建一个名为 Users
的数据表,可以运行以下命令:
sequelize model:create --name Users --attributes \ username:string \ password:string \ email:string
该命令会生成一个名为 user.js
的模型文件,并创建一个名为 Users
的数据表,该表包含三个字段:
module.exports = (sequelize, DataTypes) => { const User = sequelize.define('Users', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false } }); return User; };
可以在模型文件中定义模型和表的属性和方法,例如:
module.exports = (sequelize, DataTypes) => { const User = sequelize.define('Users', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false } }, { freezeTableName: true, // 禁止 Sequelize 自动将表名变成复数形式 timestamps: true, // 自动添加 createdAt 和 updatedAt 字段 paranoid: true // 自动添加 deletedAt 字段,实现软删除 }); User.associate = models => { User.hasMany(models.Posts, { foreignKey: 'userId' }); User.belongsToMany(models.Groups, { through: models.UserGroups }); }; User.prototype.sayHello = function() { console.log(`Hello, I'm ${this.username}!`); }; return User; };
手动编写模型文件
手动编写模型文件可以更加灵活地定义数据表和模型,通常包括两部分:
- 使用
sequelize.define
方法定义模型和表的属性和方法; - 在模型文件中配置模型之间的关系和约束。
const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('mysql://root:password@localhost/mydb'); const User = sequelize.define('Users', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { isEmail: true } } }, { tableName: 'users', // 指定数据表名 timestamps: true, // 自动添加 createdAt 和 updatedAt 字段 paranoid: true // 自动添加 deletedAt 字段,实现软删除 }); User.associate = models => { User.hasMany(models.Posts, { foreignKey: 'userId' }); User.belongsToMany(models.Groups, { through: models.UserGroups }); }; User.prototype.sayHello = function() { console.log(`Hello, I'm ${this.username}!`); }; module.exports = User;
Sequelize 操作数据表
在定义了 Sequelize 的模型之后,就可以使用 Sequelize 提供的方法来操作数据表。
数据表操作方法
Sequelize 提供了一些常用的数据表操作方法,例如:
User.create({ username: 'test', password: '123456', email: 'test@example.com' }); User.findOne({ where: { username: 'test' } }); User.findAll({ where: { username: 'test' } }); User.update({ password: '654321' }, { where: { username: 'test' } }); User.destroy({ where: { username: 'test' } });
数据表查询方法
Sequelize 提供了多种方式查询数据表:
User.findByPk(id); User.findOne({ where: { username } }); User.findAll({ where: { username: { [Op.like]: '%test%' } } }); User.count({ where: { username: { [Op.like]: '%test%' } } }); User.max('age', { where: { username: 'test' } }); User.min('age', { where: { username: 'test' } }); User.sum('age', { where: { username: 'test' } });
在查询数据表时,可以使用 Sequelize 提供的查询条件和操作符,例如:
// 查询用户名称包含 'test' 的数据 User.findAll({ where: { username: { [Op.like]: '%test%' } } }); // 查询用户 ID 在 1~10 的数据 User.findAll({ where: { id: { [Op.between]: [1, 10] } } }); // 查询用户 ID 不在 1~10 的数据 User.findAll({ where: { id: { [Op.notBetween]: [1, 10] } } }); // 查询用户名称为 'test' 或 'test2' 的数据 User.findAll({ where: { username: { [Op.or]: ['test', 'test2'] } } }); // 查询年龄小于 20 或大于 30 的数据 User.findAll({ where: { age: { [Op.or]: [{ [Op.lt]: 20 }, { [Op.gt]: 30 }] } } }); // 查询邮箱为空的数据 User.findAll({ where: { email: { [Op.eq]: null } } });
数据表关联查询
Sequelize 还提供了多种关联查询方法来实现多个数据表的联合查询,包括一对一关联查询、一对多关联查询、多对多关联查询等。例如:
// 一对一关联查询 User.hasOne(Profile); User.findAll({ include: [Profile] }); // 一对多关联查询 User.hasMany(Posts); User.findAll({ include: [Posts] }); // 多对多关联查询 User.belongsToMany(Group, { through: UserGroup });
总结
本文主要介绍了 Sequelize 在 MySQL 数据库中的使用方法,包括创建 Sequelize 模型、使用 Sequelize 操作数据表、查询数据表和关联查询等内容。通过学习本文,读者可以了解 Sequelize 的基本使用方法,并能够在 Node.js 环境中使用 Sequelize 操作 MySQL 数据库。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b1d3dfadd4f0e0ffb06c23