第10回-模型、迁移与种子学习笔记#
记录日期: 2025年6月19日
学习目标#
- 理解Sequelize中的模型(Model)概念
- 掌握数据库迁移(Migration)的操作流程
- 学习使用种子(Seed)数据初始化数据库
- 实践常用的CLI命令
模型(Model)创建#
使用CLI创建模型#
Sequelize CLI提供了便捷的模型生成命令,可以同时创建模型文件和对应的迁移文件:
1
|
sequelize model:generate --name Article --attributes title:string,content:text
|
这个命令会:
- 在
models目录下创建article.js模型文件
- 在
migrations目录下创建对应的迁移文件
解析命令参数#
--name Article: 指定模型名称(首字母大写,单数形式)
--attributes title:string,content:text: 定义模型属性和数据类型
title:string: 标题字段,字符串类型
content:text: 内容字段,文本类型
模型文件结构#
生成的模型文件(models/article.js)大致结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Article extends Model {
static associate(models) {
// 定义与其他模型的关联
}
}
Article.init({
title: DataTypes.STRING,
content: DataTypes.TEXT
}, {
sequelize,
modelName: 'Article',
});
return Article;
};
|
数据库迁移(Migration)#
执行迁移#
创建模型后,需要将变更应用到数据库中:
注意:命令是db:migrate而不是db:migurate,拼写需要特别注意
迁移文件结构#
迁移文件包含up和down两个方法:
up: 执行迁移时的操作(创建表等)
down: 回滚迁移时的操作(删除表等)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Articles', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
title: {
type: Sequelize.STRING
},
content: {
type: Sequelize.TEXT
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('Articles');
}
};
|
常用迁移命令#
1
2
3
4
5
6
7
8
9
10
11
|
# 执行所有未执行的迁移
sequelize db:migrate
# 回滚最近的一次迁移
sequelize db:migrate:undo
# 回滚所有迁移
sequelize db:migrate:undo:all
# 查看迁移状态
sequelize db:migrate:status
|
种子数据(Seed)#
创建种子数据文件#
1
|
sequelize seed:generate --name demo-articles
|
编写种子数据#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.bulkInsert('Articles', [
{
title: '第一篇文章',
content: '这是第一篇测试文章内容',
createdAt: new Date(),
updatedAt: new Date()
},
{
title: '第二篇文章',
content: '这是第二篇测试文章内容',
createdAt: new Date(),
updatedAt: new Date()
}
]);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('Articles', null, {});
}
};
|
执行种子数据#
1
2
3
4
5
6
7
8
|
# 执行所有种子文件
sequelize db:seed:all
# 执行特定种子文件
sequelize db:seed --seed 文件名
# 撤销所有种子
sequelize db:seed:undo:all
|
实践流程总结#
- 创建模型和迁移文件:
sequelize model:generate
- 执行迁移创建表结构:
sequelize db:migrate
- 创建种子数据文件:
sequelize seed:generate
- 编辑种子数据内容
- 执行种子数据填充:
sequelize db:seed:all
常见问题与解决方案#
- 迁移失败: 检查数据库连接配置和表是否已存在
- 回滚问题: 可能需要手动修改
SequelizeMeta表
- 字段类型错误: 确认模型定义和实际数据库类型一致
学习资源#
学习记录者: [你的名字]