我们可以直接通过mysql命令将表直接建好,但是这并不是一个对多人协作非常友好的模式。在项目演进的过程中,每一个迭代都有可能对数据库数据结构进行变更,怎样跟踪每一个迭代的数据变更,并在不同的环境(开发、测试、CI)和迭代切换中快速变更数据结构呢?我们可以使用Migrations来帮我们管理数据结构的变更。
初始化 Migrations
安装sequelize-cli
:
1 | npm i --save-dev sequelize-cli |
然后运行:
1 | npx sequelize init |
会创建一些文件夹:
1 | Created "config/config.json" |
这样就初始化好了。
这样的话我们的项目文件会变得很凌乱,我们希望在一个文件夹中管理Sequelize Migrations
相关的东西,我们可以创建一个配置文件.sequelizerc
:
1 | ; |
然后运行:npx sequelize init
,即可在database
目录下创建对应的文件。
配置数据库
在运行migration
更新数据库的时候,是需要连接数据库的(这不是废话么)。我们需要在/database/config.json
中配置好我们的数据库连接信息:
1 | { |
默认使用的是development
的配置,在这里配置好即可。
配置Migration文件
我们来编写项目中创建User表的Migration文件。先使用命令创建文件:
1 | npx sequelize migration:generate --name=init-user |
执行完毕后会在database/migrations
目录下产生一个migration文件:${timestamp}-init-user.js
,我们通过修改它来初始化user
表:
1 | ; |
然后执行migrate进行数据库变更:
1 | npx sequelize db:migrate |
执行完毕后,我们查看数据库,成功的创建了user
表。
在执行完毕后,在数据库中会有个SequelizeMeta
表,里面有执行的记录:
1 | mysql> select * from SequelizeMeta; |
执行一次数据库更新
我们有一个相册表album
,里面有名字、描述之类的字段。坑爹的产品忽然说要在album
上增加一个相册封面的字段,就叫cover
。得,这不是一个简单的ui变更,这要在数据库上更新字段。我们来用migrations
来处理这个变更。
首先,生成一个更新的记录:
1 | npx sequelize migration:generate --name=update-album |
可以看到在/database/migrations
目录下新增了个js文件:202005xxxxxxxxxxxxx-update-album.js
文件。前面的那一串数字是当前创建时候的时间作为唯一性前缀,保证这个文件是唯一的,因为在执行这个更新的时候是把这个文件的名字写入到数据库中的执行记录表的。
然后我们去编辑这个js文件:
1 | ; |
里面的up
表示升级的时候执行的内容:在album
表中新增一条cover
的字段。down
表示降级的时候执行的内容:将cover
字段从album
表中删除。
然后我们来执行更新:
1 | npx sequelize db:migrate |
执行完毕后可以去数据库中查看对应的表,是可以看到cover
字段已经被添加到了albuma
表中了。
加入添加好了,坑爹的产品又来说我们不需要这个字段了,删除它,那我们可以很方便的降级:
1 | npx sequelize db:migrate:undo |
执行完毕后可以看到album
中的cover
字段消失了。nice~
更新线上数据库
需要在/database/config.json
中配置好生产环境的mysql配置:
1 | { |
然后运行:
1 | npx sequelize db:migrate --env production |
这样就可以更新线上的数据库了。
用了之后才慢慢有了概念,migrations
提供的是一个数据库渐进式开发的管理过程。每次变更都以js文件的形式跟踪,然后执行变更或者撤销变更都变得非常方便。在执行变更的时候,也是将文件名写入migrations
的变更执行记录表中。的确是很方便。