第10回-模型、迁移与种子学习笔记

记录日期: 2025年6月19日

学习目标

  • 理解Sequelize中的模型(Model)概念
  • 掌握数据库迁移(Migration)的操作流程
  • 学习使用种子(Seed)数据初始化数据库
  • 实践常用的CLI命令

模型(Model)创建

使用CLI创建模型

Sequelize CLI提供了便捷的模型生成命令,可以同时创建模型文件和对应的迁移文件:

1
sequelize model:generate --name Article --attributes title:string,content:text

这个命令会:

  1. models目录下创建article.js模型文件
  2. 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)

执行迁移

创建模型后,需要将变更应用到数据库中:

1
sequelize db:migrate

注意:命令是db:migrate而不是db:migurate,拼写需要特别注意

迁移文件结构

迁移文件包含updown两个方法:

  • 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

实践流程总结

  1. 创建模型和迁移文件: sequelize model:generate
  2. 执行迁移创建表结构: sequelize db:migrate
  3. 创建种子数据文件: sequelize seed:generate
  4. 编辑种子数据内容
  5. 执行种子数据填充: sequelize db:seed:all

常见问题与解决方案

  • 迁移失败: 检查数据库连接配置和表是否已存在
  • 回滚问题: 可能需要手动修改SequelizeMeta
  • 字段类型错误: 确认模型定义和实际数据库类型一致

学习资源


学习记录者: [你的名字]