找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 22|回复: 5

模型、迁移与种子

[复制链接]

5

主题

8

回帖

37

积分

管理员

积分
37
发表于 14 小时前 | 显示全部楼层 |阅读模式
1. 数据库配置 config.json

接上一节的课程继续。首先看到config/config.json文件,打开后,很明显,这是连接数据库的配置文件。

当我们把这里配置好,Node项目就会自动的,连接到数据库上了。注意看,这里有三组配置,分别是:development、test和production。它们分别是开发环境、测试环境,还有开发完成后,要部署上线的生产环境的配置。
环境     说明
development     开发环境
test     测试环境
production     生产环境

现在,我们在开发过程中,所以只需要关注开发环境就好了。

那么来修改配置

   
{
  "development": {
    "username": "root",
    "password": "clwy1234",
    "database": "clwy_api_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "clwy_api_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "clwy_api_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00"
  }
}

第一个要改的就是密码,修改成docker配置里,我们设定的密码。接着要改的是数据库的名字,改为clwy_api_development。

最下面,还要加上时区的配置,因为我们中国是在+8区。这样在查询的时候,时间才不会出错。

那么同样的,也简单的给test和production也调整一下。
2. 模型

现在使用数据库客户端软件,将之前人工建的Articles表直接删除,因为这个表还缺少一些sequelize所需要的字段。而且我们现在可以使用sequelize来创建数据表,而不用手动建表。

image.png

接着,大家一起来看一个神奇的咒语,
接着,大家一起来看一个神奇的咒语,
   
sequelize model:generate --name Article --attributes title:string,content:text
这个咒语,是用来新建模型的,将来大家还会经常用到它的。
打开models/article.js。可以看到,在模型文件夹中,出现了一个叫做Article的模型,它里面有标题和内容。
标题是字符串类型,对应到 MySQL 数据库里,它就会自动变成varchar。内容部分,则是text类型。
现在就只需要知道,模型就是用来操作数据库的,就是因为有这个文件的存在,我们后面才能使用Article.findAll()这种代码来查询数据。模型里还有一些其他的东西,我们暂时不用管它,后面学到了相关的知识了,我们到时候再来修改。

3. 迁移文件再来看看migrations文件夹,里面出现了一个由当前时间,加上create-article命名的文件,这个文件就是迁移文件了。它的作用就是用来创建、修改表的。看到这里,在up部分。我们通过createTabel,创建了一个叫做Articles的表。
大家注意哦,这就是我之前和大家说的,模型名字是单数:Article。但是表的名字一定是复数形式,也就是Articles。这是sequelize里的命名规则,一定不要搞错了。如果你的单复数搞错了,那sequelize就找不到对应的东西了。
接着往下看,这些就是定义了Articles这张表里面所拥有的字段了,比方说id、title、content,这些外还出现了两个时间字段createdAt和updatedAt。
这两个字段,当在新增或修改数据的时候,sequelize会自动的帮我们填写的。
这里的内容,已经非常好了,我们只需要做一个小小的调整。就是title部分,我需要它不为null,所以加上allowNull: false,。content部分,我们就不管它了,已经很好了。
至于down部分,是新建表的反向操作,里面写的是dropTable,也就是删除当前的表。这样当我们创建表,建完后,突然又发现有错误,也可以通过相关命令来删除当前表。

3.1. 运行迁移改完后,再来学另一条新咒语。
   
sequelize db:migrate打开数据库客户端,刷新一下,可以看到Articles表又神奇的出现了。看一看结构选项卡,里面的字段和我们当时自己手动创建的完全一样,而且还多了两个时间字段。这就是迁移文件的作用了。
另外一张表SequelizeMeta是我们运行迁移命令时,自动生成的。这张表里记录了当前已经跑过了哪些迁移,这样当你再次运行sequelize db:migrate时,已经运行过的迁移文件,就不会重复再次执行了。

4. 种子文件现在表也有了,下一步就是要填充一些在开发中用来测试的数据了。当然你可以用手动往里面一点点填,但很多情况我们做测试,可能需要非常多的数据。例如我希望数据库里有 100 篇文章,这时候,我们一条条的录入也太笨了点。最简单的方法就是使用种子文件了。再来试试这条命令
   
sequelize seed:generate --name article完成后,在seeds目录,就看到刚才命令新建的种子文件了。同样也是分为两个部分,up部分用来填充数据,down部分是反向操作,用来删除数据的。
先来看up部分,默认生成的代码里,给了我们一个案例。很明显,它这里是往People表里,插入了一点儿数据。
   
await queryInterface.bulkInsert('People', [{  name: 'John Doe',  isBetaMember: false}], {});我们可以参考它的写法,改为往Articles表里插入数据。
   
async up (queryInterface, Sequelize) {  const articles = [];  const counts = 100;  for (let i = 1; i <= counts; i++) {    const article = {      title: `文章的标题 ${i}`,      content: `文章的内容 ${i}`,      createdAt: new Date(),      updatedAt: new Date(),    };    articles.push(article);  }  await queryInterface.bulkInsert('Articles', articles, {});},因为计划要插入 100 条数据,所以我们定义一个叫做articles的常量,它默认是一个空数组。
接着再定义一个计数器,counts = 100。然后简单的写一个for循环,在title和content部分,我们加上i,这样每个标题和内容都有一个序号,便于我们使用。
两个时间字段,就用现在的当前时间。
然后把循环的数据,通过push,不断的添加到articles里。最后一次性把所有的数据,插入到Articles表中。
至于down部分,也参考它的格式,修改一下
   
async down (queryInterface, Sequelize) {  await queryInterface.bulkDelete('Articles', null, {});}
4.1. 运行种子又到了激动人心的时刻了,大家一起来见证奇迹吧。开始运行种子,注意最后面这里,需要填写上你的种子文件的文件名。大家每个人都是不一样的,千万不要直接照抄。
   
sequelize db:seed --seed xxx-article刷新数据库,十万分之一个呼吸的时间,一百条数据已经插入完成。


5. 总结一下大家注意了,日常开发项目,都是采用固定的步骤:
步骤命令说明
第一步sequelize model:generate --name Article --attributes ...建模型和迁移文件
第二步人工处理根据需求调整迁移文件
第三步sequelize db:migrate运行迁移,生成数据表
第四步sequelize seed:generate --name article新建种子文件
第五步人工处理将种子文件修改为自己想填充的数据
第六步sequelize db:seed --seed xxx-article运行种子文件,将数据填充到数据表中
这里的种子部分并不是必须的,但对于一些需要一下子插入大量数据的情况来说,使用种子还是非常方便的。我们可以根据实际的需求来灵活运用。



5

主题

8

回帖

37

积分

管理员

积分
37
 楼主| 发表于 14 小时前 | 显示全部楼层
PS E:\Developer\clwy-api> sequelize model:generate --name Article --attributes title:string,content:text

Sequelize CLI [Node: 20.17.0, CLI: 6.6.5, ORM: 6.37.8]

New model was created at E:\Developer\clwy-api\models\article.js .
New migration was created at E:\Developer\clwy-api\migrations\20261002163006-create-article.js .

models --葫芦---模型用来操作数据库
migrations ---瓢----迁移文件,用来创建修改表

生成表命令-----增加了表结构------
sequelize db:migrate
PS E:\Developer\clwy-api> sequelize db:migrate   

Sequelize CLI [Node: 20.17.0, CLI: 6.6.5, ORM: 6.37.8]

Loaded configuration file "config\config.json".
Using environment "development".
== 20261002163006-create-article: migrating =======
== 20261002163006-create-article: migrated (0.059s)

5

主题

8

回帖

37

积分

管理员

积分
37
 楼主| 发表于 14 小时前 | 显示全部楼层
4. 种子文件

现在表也有了,下一步就是要填充一些在开发中用来测试的数据了。当然你可以用手动往里面一点点填,但很多情况我们做测试,可能需要非常多的数据。例如我希望数据库里有 100 篇文章,这时候,我们一条条的录入也太笨了点。最简单的方法就是使用种子文件了。再来试试这条命令

   
sequelize seed:generate --name article

完成后,在seeds目录,就看到刚才命令新建的种子文件了。同样也是分为两个部分,up部分用来填充数据,down部分是反向操作,用来删除数据的。

先来看up部分,默认生成的代码里,给了我们一个案例。很明显,它这里是往People表里,插入了一点儿数据。

   
await queryInterface.bulkInsert('People', [{
  name: 'John Doe',
  isBetaMember: false
}], {});

我们可以参考它的写法,改为往Articles表里插入数据。

   
async up (queryInterface, Sequelize) {
  const articles = [];
  const counts = 100;

  for (let i = 1; i <= counts; i++) {
    const article = {
      title: `文章的标题 ${i}`,
      content: `文章的内容 ${i}`,
      createdAt: new Date(),
      updatedAt: new Date(),
    };

    articles.push(article);
  }

  await queryInterface.bulkInsert('Articles', articles, {});
},

因为计划要插入 100 条数据,所以我们定义一个叫做articles的常量,它默认是一个空数组。

接着再定义一个计数器,counts = 100。然后简单的写一个for循环,在title和content部分,我们加上i,这样每个标题和内容都有一个序号,便于我们使用。

两个时间字段,就用现在的当前时间。

然后把循环的数据,通过push,不断的添加到articles里。最后一次性把所有的数据,插入到Articles表中。

至于down部分,也参考它的格式,修改一下

   
async down (queryInterface, Sequelize) {
  await queryInterface.bulkDelete('Articles', null, {});
}

4.1. 运行种子

又到了激动人心的时刻了,大家一起来见证奇迹吧。开始运行种子,注意最后面这里,需要填写上你的种子文件的文件名。大家每个人都是不一样的,千万不要直接照抄。

   
sequelize db:seed --seed xxx-article

刷新数据库,十万分之一个呼吸的时间,一百条数据已经插入完成。

image.png
5. 总结一下

大家注意了,日常开发项目,都是采用固定的步骤:
步骤         命令         说明
第一步         sequelize model:generate --name Article --attributes ...         建模型和迁移文件
第二步         人工处理         根据需求调整迁移文件
第三步         sequelize db:migrate         运行迁移,生成数据表
第四步         sequelize seed:generate --name article         新建种子文件
第五步         人工处理         将种子文件修改为自己想填充的数据
第六步         sequelize db:seed --seed xxx-article         运行种子文件,将数据填充到数据表中

这里的种子部分并不是必须的,但对于一些需要一下子插入大量数据的情况来说,使用种子还是非常方便的。我们可以根据实际的需求来灵活运用。

5

主题

8

回帖

37

积分

管理员

积分
37
 楼主| 发表于 14 小时前 | 显示全部楼层
admin 发表于 2026-10-3 00:57
4. 种子文件

现在表也有了,下一步就是要填充一些在开发中用来测试的数据了。当然你可以用手动往里面一点 ...

PS E:\Developer\clwy-api> sequelize seed:generate --name article

Sequelize CLI [Node: 20.17.0, CLI: 6.6.5, ORM: 6.37.8]

seeders folder at "E:\Developer\clwy-api\seeders" already exists.
New seed was created at E:\Developer\clwy-api\seeders\20261002165854-article.js .

5

主题

8

回帖

37

积分

管理员

积分
37
 楼主| 发表于 14 小时前 | 显示全部楼层
运行种子文件
PS E:\Developer\clwy-api> sequelize db:seed --seed 20261002165854-article

Sequelize CLI [Node: 20.17.0, CLI: 6.6.5, ORM: 6.37.8]

Loaded configuration file "config\config.json".
Using environment "development".
== 20261002165854-article: migrating =======

5

主题

8

回帖

37

积分

管理员

积分
37
 楼主| 发表于 13 小时前 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|知行合一

GMT+8, 2026-10-3 15:13 , Processed in 0.074789 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表