Skip to content

Prisma 迁移介绍

流程

Prisma 会在 你的数据库中新建一个表.这个表存的就是你的迁移文件.每次你运行 prisma migrate dev 或者 prisma migrate deploy 的时候,Prisma 都会检查你的迁移文件和数据库中的迁移表,然后对比出差异,然后执行迁移.

注意

  1. 写模型

  2. 推送数据库本地保存 sql

  3. 生成本地 client

举例

(1) 写模型

  • 模型
ts
generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model user {
  id       Int     @id @default(autoincrement())
  name     String?
  password String? @db.VarChar(64)
}

(2) 推送数据库本地保存 sql

  • 代码 init 可以随意写
ts
npx prisma migrate dev --name init

这个操作会将 prisma 结构同步到数据库当中,并且创建一个 migrations 记录

bash
migrations/
  └─ 20241122022542_init/
    └─ migration.sql

默认的 migrations 记录都是以时间开头 + 下划线 + 名称。

这里面的migration.sql内容就是修改数据库使用的 SQL 语句:

sql

-- CreateTable
CREATE TABLE user (
 id INT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(255),
 password VARCHAR(64)
);

(3) 生成本地 client

ts
npx prisma generate

(4) 查询即可

继续修改数据库

(1) 更改模型

现在我们更新模型新增加一个用户创建时间字段

ts
model user {
  id        Int      @id @default(autoincrement())
  name      String?
  password  String?  @db.VarChar(64)
  createdAt DateTime @default(now())// 新增加的
}

(2) 推送数据库本地保存 sql

ts
npx prisma migrate dev --name add-createdAt

这个操作会将 prisma 结构同步到数据库当中,并且创建一个 migrations 记录

bash
migrations/
  └─ 20241122022542_init/
    └─ migration.sql
  └─ 20241122022542_add-createdAt/
    └─ migration.sql

这里面的migration.sql内容就是修改数据库使用的 SQL 语句:

sql

ALTER TABLE `user` ADD COLUMN `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);

(3) 生成本地 client

ts
npx prisma generate

(4) 查询即可

部署(无迁移记录)

直接同步

  • 推送
ts
npx prisma db push

这样会将现有的数据库直接重置

  • 拉取
ts
npx prisma db pull --force

拉取后一定要用npx prisma generate重新生成客户端

但是这两个命令都没有办法管理迁移历史,只是直接将 Prisma 结构同步到数据库(或将数据库同步到 Prisma 结构)当中。

这两个命令适用于项目创建的时候,或需要覆盖的时候。

部署(有迁移记录)

生成记录

每一次修改表结构.推送.然后生成本地客户端.这样就可以生成迁移记录

ts
npx prisma migrate dev --name 你自己起的名字

第二种

已经有了所有的迁移记录

即 migrations/许多文件夹/保存记录

直接运行

ts
npx prisma migrate deploy

这个命令会将所有的迁移记录同步到数据库当中