Outline 如何创建、运行并回滚数据库迁移?
【免费下载链接】outlineThe fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.项目地址: https://gitcode.com/GitHub_Trending/ou/outline
Outline 后端使用 PostgreSQL 并通过 Sequelize 管理数据库结构。当你为server/models/中的 Sequelize 模型做了改动(加字段、加索引等),需要生成一个迁移文件、在目标数据库上执行它,并在出问题时把最近一次迁移撤销掉。Outline 已经把这三步封装成package.json里的 yarn 脚本,本文按「创建 → 运行 → 验证 → 回滚」的顺序走一遍完整流程,并说明在测试库上演练的方式。
前提条件
- 已按项目要求完成开发环境搭建:依赖用 yarn 安装,
server/下的后端使用 Koa + Sequelize ORM,数据库为 PostgreSQL,另外还需要 Redis(见 AGENTS.md 开头的项目描述)。 package.json中的 sequelize-cli 脚本是本文所有命令的基础,它们的实际定义如下:
"db:create-migration": "sequelize migration:create", "db:create": "sequelize db:create", "db:migrate": "sequelize db:migrate", "db:rollback": "sequelize db:migrate:undo", "db:reset": "sequelize db:drop && sequelize db:create && sequelize db:migrate"- 迁移文件统一放在 server/migrations 目录,文件名带时间戳前缀,例如
20160619080644-initial.js、20160622043741-add-parent-document.js。新建的迁移会按同样的规则生成到该目录。
创建迁移
README 的 Migrations 章节给出的创建命令:
yarn db:create-migration --name my-migration执行后 Sequelize CLI 会在server/migrations/下生成一个新的迁移文件。AGENTS.md 的 Database & ORM 一节也给出了等价的直连 CLI 写法,并示范了迁移命名习惯:
yarn sequelize migration:create --name=add-field-to-table生成之后,按你实际要改的模型编辑这个迁移文件(建表、加列、加索引等),迁移中涉及多表的操作应使用事务(AGENTS.md 的要求)。
运行迁移
在主数据库(开发环境默认指向的库)上应用全部未执行的迁移:
yarn db:migrate如果只想在测试数据库上跑迁移,README 明确支持通过--env参数指定环境:
yarn db:migrate --env test--env test是安全演练的首选路径:先确认迁移在测试库上能跑通,再对主库执行yarn db:migrate。
验证迁移是否已应用
项目文档没有单独给出「查询 Sequelize 迁移记录表」的检查命令,但它提供了两种可以判断迁移状态的方式:
- 测试流程作为验证路径。Makefile 的
test目标完整演示了在测试库上应用迁移的标准做法:
test: docker compose up -d postgres NODE_ENV=test yarn sequelize db:drop NODE_ENV=test yarn sequelize db:create NODE_ENV=test yarn sequelize db:migrate yarn test即在测试环境先 drop、再 create、最后 migrate,迁移能顺利跑完且后续yarn test通过,说明该迁移对模型结构是自洽的。注意这里用NODE_ENV=test环境变量来锁定测试库,与yarn db:migrate --env test是同一目的。make watch目标用的是同样的 drop/create/migrate 三步。
- 观察生成与落库结果。迁移执行后,
server/migrations/中新增的文件时间戳早于运行时刻,且后端应用(模型层)可以按新结构正常工作;README 也指出开发模式下 Outline 会输出带分类前缀的控制台日志,配合DEBUG=database与LOG_LEVEL=debug可以查看数据库相关的详细日志来排查问题。
回滚最近一次迁移
撤销最近一次已应用的迁移:
yarn db:rollback该脚本对应sequelize db:migrate:undo,只回滚最后一次迁移,不指定其他范围,适合「刚跑的这一步写错了」的场景。
重建整个数据库(破坏性,谨慎使用)
脚本里还有一个db:reset:
yarn db:reset它依次执行sequelize db:drop && sequelize db:create && sequelize db:migrate,即先删除数据库再重新创建并全量应用迁移。按 package.json 中的定义,不带NODE_ENV=test时它作用于默认指向的数据库,会丢失其中全部数据,只能用于开发环境;如需对测试库做同样的重置,参照 Makefile 的写法显式带上NODE_ENV=test。
生产部署时的迁移执行
如果你用容器镜像部署,package.json 中定义了 Heroku 构建钩子:
"heroku-postbuild": "yarn build && yarn db:migrate"即在构建完成后自动执行yarn db:migrate。这意味着走这条构建流程时迁移会在部署阶段被自动应用;如果你使用其他部署方式,就需要在部署流程中手动保留这一步,否则数据库结构会落后于代码。
边界与限制
- 本文所有命令均来自 README.md 的 Migrations 章节、AGENTS.md 与 Makefile,文档未提供「查看当前未应用迁移列表」之类的额外命令;执行前可自行阅读
server/migrations/下新增文件的内容确认变更范围。 db:rollback一次只回滚一步,多步错误需要多次执行;db:reset是删库重建,不要在没有数据备份的库上尝试。- 迁移文件本身由你手写 SQL/Sequelize 调用,文档没有约定模板函数结构,直接参照
server/migrations/中既有文件的写法即可。
【免费下载链接】outlineThe fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.项目地址: https://gitcode.com/GitHub_Trending/ou/outline
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考