本文目录导读:
这是一个非常核心的全栈开发问题,数据库迁移(Migration)是现代全栈框架中版本控制数据库结构的标准方式,它允许你像管理代码一样管理数据库的变更。
下面我将主流全栈框架的数据库迁移操作分类说明,涵盖前端全栈和后端全栈框架。
核心概念
无论哪个框架,迁移的核心流程基本一致:
- 创建迁移文件:生成一个包含
up(执行)和down(回滚)方法的文件。 - 编写逻辑:在文件中定义字段、索引、表关系等。
- 执行迁移:运行命令,将变更应用到数据库。
- 回滚迁移:如果出错,用命令撤销最近的一次或多次迁移。
- 刷新/重置:删除所有表并重新运行所有迁移(常用于开发环境)。
后端全栈框架(最典型)
这类框架自带全套解决方案,迁移工具是其核心功能。
a. Laravel (PHP) + Eloquent ORM
-
工具:内置
Schema门面。 -
文件位置:
database/migrations/ -
创建迁移:
php artisan make:migration create_users_table
-
编写
up方法:// database/migrations/XXXX_create_users_table.php public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamps(); }); } public function down() { Schema::dropIfExists('users'); } -
执行迁移:
php artisan migrate
-
回滚:
php artisan migrate:rollback # 回滚最近一批 php artisan migrate:reset # 回滚全部 php artisan migrate:refresh # 回滚并重新迁移(不丢失数据种子) php artisan migrate:fresh # 删除所有表并重新迁移(数据会丢失)
b. Ruby on Rails (Ruby) + ActiveRecord
-
工具:内置
ActiveRecord::Migration。 -
文件位置:
db/migrate/ -
创建迁移:
rails generate migration CreateUsers name:string email:string
-
自动生成的迁移文件:
# db/migrate/XXXX_create_users.rb class CreateUsers < ActiveRecord::Migration[7.0] def change create_table :users do |t| t.string :name t.string :email t.timestamps end end end -
执行迁移:
rails db:migrate
-
回滚:
rails db:rollback # 回滚上一步 rails db:migrate:down VERSION=20230101000000 # 回滚到指定版本 rails db:migrate:reset # 回滚并重新迁移
c. Django (Python) + ORM(稍有不同)
-
概念:Django 使用
makemigrations+migrate两步操作。 -
文件位置:
app_name/migrations/ -
操作流程:
# 1. 在 models.py 中定义模型 # 2. 检测模型变更并生成迁移文件 python manage.py makemigrations # 3. 将生成的文件应用到数据库 python manage.py migrate
-
查看 SQL:
python manage.py sqlmigrate app_name 0001
-
回滚:Django 没有直接的
rollback,需要迁移到前一个版本:python manage.py migrate app_name 0001 # 回滚到编号为 0001 的迁移
全栈 TypeScript/JavaScript 框架(后端部分)
a. NestJS (Node.js)
-
推荐工具:
TypeORM或Prisma,NestJS 官方推荐 TypeORM。 -
TypeORM 操作:
# 1. 配置数据源(data-source.ts) # 2. 生成迁移(基于实体变化自动生成) npx typeorm migration:generate src/migrations/CreateUser -d src/data-source.ts # 3. 执行迁移 npx typeorm migration:run -d src/data-source.ts # 4. 回滚 npx typeorm migration:revert -d src/data-source.ts
-
Prisma 操作(更现代、更简单):
# 1. 定义 schema (schema.prisma) # 2. 创建和应用迁移 npx prisma migrate dev --name add_user_table # 3. 部署到生产环境 npx prisma migrate deploy # 4. Prisma 回滚需要手动恢复,推荐使用 `prisma migrate diff`
b. AdonisJS (Node.js)
- 工具:内置
@adonisjs/lucidORM。 - 操作:
# 创建迁移 node ace make:migration users # 执行迁移 node ace migration:run # 回滚 node ace migration:rollback # 刷新 node ace migration:refresh
前端全栈框架(带后端能力)
a. Next.js (React) + Prisma / Drizzle ORM
-
Prisma 操作:同上,非常流行。
npx prisma migrate dev --name add_user_table npx prisma migrate deploy # 生产环境 npx prisma migrate reset # 开发环境重置
-
Drizzle ORM(新锐,类型安全极佳):
# 生成迁移(需要配置 drizzle.config.ts) npx drizzle-kit generate --name add_users # 执行迁移 npx drizzle-kit migrate # Drizzle 的回滚通过 `push` 和 `pull` 管理,或手动修改 SQL 文件
b. Nuxt.js (Vue) + Prisma / Drizzle ORM
- 与 Next.js 完全一致,使用 Prisma 或 Drizzle 作为 ORM。
c. Remix / SvelteKit
- 同样,通常搭配 Prisma 或 Drizzle。
无框架 / 通用工具
- Flyway (Java/JVM):数据库迁移的标准工具,可以集成到任何项目中。
- Alembic (Python SQLAlchemy):SQLAlchemy 的迁移工具。
- Knex.js (Node.js):一个 SQL 查询构建器,自带强大的迁移功能。
| 框架/条件 | 核心命令 | 回滚方式 | 生产环境建议 |
|---|---|---|---|
| Laravel | php artisan migrate |
migrate:rollback |
migrate 即可,不要用 fresh |
| Rails | rails db:migrate |
db:rollback |
使用 db:migrate |
| Django | python manage.py migrate |
migrate app 0001 |
使用 migrate |
| Next.js/NestJS | npx prisma migrate dev |
reset (开发)、migrate diff (生产) |
migrate deploy |
| 通用原则 | 创建 -> 写SQL -> 备份 -> 执行 -> 验证 | 备份优先于回滚 | 永远不要在 migrate:fresh 上直接跑生产 |
重要建议:
- 不要在
migrate:fresh或refresh上直接跑生产环境,这会删除所有表和数据,生产环境只用migrate。 - 每次迁移只做一件事:增加一个字段、修改一个索引等,这样更容易排查问题。
- 生产环境回滚前,先备份数据库,因为有些迁移(如删除列)一旦提交,数据就彻底没了。
- 迁移文件应该纳入版本控制(Git),就像普通代码一样。
- 创建迁移时,最好提供
down方法(或自动生成),确保可以安全回滚。
如果你能告诉我你具体使用的是哪个框架(Next.js + Prisma 还是 Laravel),我可以给你更详细、更具体的命令和示例。
标签: 全栈框架