Sequelize使用
什么是Sequelize
Sequelize是一个基于Promise的Node.js ORM(对象关系映射)工具,支持多种数据库包括PostgreSQL、MySQL、MariaDB、SQLite和Microsoft SQL Server。它提供了强大的功能如关联查询、事务、读取复制等。
安装与配置
安装Sequelize
bash
# 安装Sequelize
npm install sequelize
# 安装数据库驱动(以MySQL为例)
npm install mysql2
连接数据库
javascript
const { Sequelize } = require('sequelize');
// 创建Sequelize实例
const sequelize = new Sequelize('database_name', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
port: 3306,
logging: false, // 禁用SQL日志
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
});
// 测试连接
async function testConnection() {
try {
await sequelize.authenticate();
console.log('数据库连接成功');
} catch (error) {
console.error('数据库连接失败:', error);
}
}
testConnection();
模型定义
基本模型定义
javascript
const { DataTypes } = require('sequelize');
const sequelize = require('./database');
// 定义用户模型
const User = sequelize.define('User', {
// 模型属性
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING(50),
allowNull: false,
validate: {
notEmpty: true,
len: [2, 50]
}
},
email: {
type: DataTypes.STRING(100),
allowNull: false,
unique: true,
validate: {
isEmail: true
}
},
age: {
type: DataTypes.TINYINT.UNSIGNED,
defaultValue: 0,
validate: {
min: 0,
max: 120
}
},
isActive: {
type: DataTypes.BOOLEAN,
defaultValue: true
}
}, {
// 模型选项
tableName: 'users',
timestamps: true, // 启用时间戳
createdAt: 'created_at',
updatedAt: 'updated_at'
});
module.exports = User;
数据类型映射
javascript
const { DataTypes } = require('sequelize');
const exampleSchema = {
// 字符串类型
stringField: DataTypes.STRING, // VARCHAR(255)
textFiled: DataTypes.TEXT, // TEXT
charField: DataTypes.CHAR(10), // CHAR(10)
// 数值类型
integerField: DataTypes.INTEGER, // INTEGER
bigIntField: DataTypes.BIGINT, // BIGINT
floatField: DataTypes.FLOAT, // FLOAT
doubleField: DataTypes.DOUBLE, // DOUBLE
decimalField: DataTypes.DECIMAL(10, 2), // DECIMAL(10,2)
// 布尔类型
booleanField: DataTypes.BOOLEAN, // BOOLEAN
// 日期时间类型
dateField: DataTypes.DATE, // DATETIME
dateOnlyField: DataTypes.DATEONLY, // DATE (仅日期)
// 其他类型
jsonField: DataTypes.JSON, // JSON
enumField: DataTypes.ENUM('a', 'b', 'c'), // ENUM
// UUID
uuidField: DataTypes.UUID // UUID
};
模型同步
javascript
const sequelize = require('./database');
const User = require('./models/User');
const Post = require('./models/Post');
// 同步单个模型
User.sync({ alter: true }) // alter: true 会修改表结构以匹配模型
.then(() => {
console.log('用户表同步完成');
});
// 同步所有模型
sequelize.sync({ alter: true })
.then(() => {
console.log('所有表同步完成');
});
// 强制同步(删除并重新创建表)
sequelize.sync({ force: true })
.then(() => {
console.log('所有表强制同步完成');
});
基本操作
创建记录
javascript
const User = require('./models/User');
// 创建单个记录
async function createUser() {
try {
const user = await User.create({
name: '张三',
email: 'zhangsan@example.com',
age: 25
});
console.log('用户创建成功:', user.toJSON());
} catch (error) {
console.error('创建失败:', error);
}
}
// 批量创建记录
async function createUsers() {
try {
const users = await User.bulkCreate([
{ name: '李四', email: 'lisi@example.com', age: 30 },
{ name: '王五', email: 'wangwu@example.com', age: 28 }
]);
console.log('用户批量创建成功:', users.length);
} catch (error) {
console.error('批量创建失败:', error);
}
}
查询记录
javascript
const User = require('./models/User');
// 查找所有记录
async function findAllUsers() {
try {
const users = await User.findAll();
console.log('所有用户:', users.map(u => u.toJSON()));
} catch (error) {
console.error('查询失败:', error);
}
}
// 条件查询
async function findUsers() {
try {
// 简单条件
const users = await User.findAll({
where: {
age: {
[Sequelize.Op.gt]: 18
}
},
order: [['age', 'ASC']],
limit: 10
});
// 复杂条件
const complexUsers = await User.findAll({
where: {
[Sequelize.Op.or]: [
{ name: '张三' },
{ age: { [Sequelize.Op.gt]: 25 } }
]
}
});
console.log('条件查询结果:', users.map(u => u.toJSON()));
} catch (error) {
console.error('条件查询失败:', error);
}
}
// 查找单个记录
async function findUser() {
try {
const user = await User.findOne({
where: { name: '张三' }
});
if (user) {
console.log('找到用户:', user.toJSON());
} else {
console.log('未找到用户');
}
} catch (error) {
console.error('查找失败:', error);
}
}
更新记录
javascript
const User = require('./models/User');
// 更新记录
async function updateUser() {
try {
const [updatedRowsCount] = await User.update(
{ age: 26 },
{ where: { name: '张三' } }
);
console.log('更新记录数:', updatedRowsCount);
} catch (error) {
console.error('更新失败:', error);
}
}
// 查找并更新
async function findAndUpdateUser() {
try {
const user = await User.findOne({ where: { name: '张三' } });
if (user) {
user.age = 26;
await user.save();
console.log('用户更新成功:', user.toJSON());
}
} catch (error) {
console.error('查找并更新失败:', error);
}
}
删除记录
javascript
const User = require('./models/User');
// 删除记录
async function deleteUser() {
try {
const deletedRowsCount = await User.destroy({
where: { name: '张三' }
});
console.log('删除记录数:', deletedRowsCount);
} catch (error) {
console.error('删除失败:', error);
}
}
// 查找并删除
async function findAndDeleteUser() {
try {
const user = await User.findOne({ where: { name: '张三' } });
if (user) {
await user.destroy();
console.log('用户删除成功');
}
} catch (error) {
console.error('查找并删除失败:', error);
}
}
关联关系
一对一关联
javascript
const { DataTypes } = require('sequelize');
const sequelize = require('./database');
// 用户模型
const User = sequelize.define('User', {
name: DataTypes.STRING
});
// 用户详情模型
const UserProfile = sequelize.define('UserProfile', {
bio: DataTypes.TEXT,
avatar: DataTypes.STRING
});
// 建立一对一关联
User.hasOne(UserProfile);
UserProfile.belongsTo(User);
// 使用关联
async function createUserWithProfile() {
try {
const user = await User.create({
name: '张三',
UserProfile: {
bio: '这是我的简介',
avatar: 'avatar.jpg'
}
}, {
include: [UserProfile]
});
console.log('用户及详情创建成功:', user.toJSON());
} catch (error) {
console.error('创建失败:', error);
}
}
一对多关联
javascript
const { DataTypes } = require('sequelize');
const sequelize = require('./database');
// 用户模型
const User = sequelize.define('User', {
name: DataTypes.STRING
});
// 文章模型
const Post = sequelize.define('Post', {
title: DataTypes.STRING,
content: DataTypes.TEXT
});
// 建立一对多关联
User.hasMany(Post);
Post.belongsTo(User);
// 使用关联
async function getUserWithPosts() {
try {
const user = await User.findByPk(1, {
include: [Post]
});
console.log('用户及其文章:', user.toJSON());
} catch (error) {
console.error('查询失败:', error);
}
}
多对多关联
javascript
const { DataTypes } = require('sequelize');
const sequelize = require('./database');
// 学生模型
const Student = sequelize.define('Student', {
name: DataTypes.STRING
});
// 课程模型
const Course = sequelize.define('Course', {
title: DataTypes.STRING
});
// 建立多对多关联
Student.belongsToMany(Course, { through: 'StudentCourses' });
Course.belongsToMany(Student, { through: 'StudentCourses' });
// 使用关联
async function enrollStudent() {
try {
const student = await Student.findByPk(1);
const course = await Course.findByPk(1);
await student.addCourse(course);
console.log('学生选课成功');
} catch (error) {
console.error('选课失败:', error);
}
}
实践项目
在博客系统中使用Sequelize实现数据模型:
- 创建用户模型(User)
- 创建文章模型(Post)
- 创建评论模型(Comment)
- 实现模型间的关联关系
- 实现基本的CRUD操作
- 添加数据验证