代码之家  ›  专栏  ›  技术社区  ›  Mohamed Rifay

使用prisma迁移到sql失败

  •  0
  • Mohamed Rifay  · 技术社区  · 1 年前

    当我在本地数据库和本地主机中使用时,迁移工作非常顺利。 但是当我部署服务器数据库时。迁移失败

    // This is your Prisma schema file,
    // learn more about it in the docs: https://pris.ly/d/prisma-schema
    
    // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
    // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
    
    generator client {
      provider = "prisma-client-js"
    }
    
    datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
     // shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
     
    }
    
    enum Role {
      ADMIN
      COACH
      CLEINT
    }
    
    model User {
      id                  Int                  @id @default(autoincrement())
      email               String
      profile             Profile?
      role                Role                 @default(CLEINT)
      createdAt           DateTime             @default(now())
      updatedAt           DateTime             @updatedAt
      underCoach          Int?
      coach               User?                @relation("CoachToUser", fields: [underCoach], references: [id])
      clients             User[]               @relation("CoachToUser")
      connectRequestsFrom ConnectRequest[]     @relation("ConnectRequestFrom")
      connectRequestsTo   ConnectRequest[]     @relation("ConnectRequestTo")
      meal                Meal[]
      MealAssignment      MealAssignment[]
      // setByUser           MealTime[]       @relation("setBy")
      // setToUser           MealTime[]       @relation("setTo")
      WorkoutsAssignment  WorkoutsAssignment[]
      Workouts            Workouts[]
    }
    
    model Profile {
      id          Int      @id @default(autoincrement())
      name        String
      dob         String
      gender      Gender   @default(MALE)
      height      Int?
      weight      Int?
      sugar       Int?
      createdAt   DateTime @default(now())
      updatedAt   DateTime @updatedAt
      userId      Int      @unique
      user        User     @relation(fields: [userId], references: [id])
      coachTypeId Int?
      coach       Coach?   @relation(fields: [coachTypeId], references: [id])
    }
    
    enum Gender {
      MALE
      FEMALE
      TRANSGENDER
    }
    
    model Coach {
      id        Int       @id @default(autoincrement())
      coachName String    @unique
      createdAt DateTime  @default(now())
      updatedAt DateTime  @updatedAt
      profile   Profile[]
    }
    
    model ConnectRequest {
      id        Int           @id @default(autoincrement())
      fromId    Int
      toId      Int
      status    RequestStatus @default(PENDING)
      from      User          @relation("ConnectRequestFrom", fields: [fromId], references: [id])
      to        User          @relation("ConnectRequestTo", fields: [toId], references: [id])
      createdAt DateTime      @default(now())
      updatedAt DateTime      @updatedAt
    }
    
    enum RequestStatus {
      PENDING
      ACCEPTED
      REJECTED
    }
    
    model Meal {
      id             Int              @id @unique @default(autoincrement())
      name           String
      protiens       Int
      fats           Int
      carbs          Int
      mealType       MealType
      // mealPlan  MealPlan[] @relation("meals")
      createdAt      DateTime         @default(now())
      updatedAt      DateTime         @updatedAt
      userId         Int
      user           User?            @relation(fields: [userId], references: [id])
      MealAssignment MealAssignment[]
    }
    
    model MealAssignment {
      id        Int      @id
      userId    Int // Adding userId directly instead of using @relation
      mealId    Int // Adding mealId directly instead of using @relation
      user      User     @relation(fields: [userId], references: [id])
      meal      Meal     @relation(fields: [mealId], references: [id])
      day       Int // Day number for which the meal is assigned
      createdAt DateTime @default(now())
      updatedAt DateTime @updatedAt
    }
    
    enum MealType {
      BREAKFAST
      LUNCH
      DINNER
      SNACK
    }
    
    model MealTime {
      id        Int      @id @unique @default(autoincrement())
      setBy     Int
      setTo     Int
      whichMeal MealType
      time      String
      createdAt DateTime @default(now())
      updatedAt DateTime @updatedAt
    }
    
    model WorkoutsAssignment {
      id              Int      @id @unique @default(autoincrement())
      assigneddUserId Int
      workoutId       Int
      user            User     @relation(fields: [assigneddUserId], references: [id])
      workout         Workouts @relation(fields: [workoutId], references: [id])
      day             Int
      completed       Boolean  @default(false)
      createdAt       DateTime @default(now())
      updatedAt       DateTime @updatedAt
    }
    
    model Workouts {
      id                 Int                  @id @unique @default(autoincrement())
      name               String
      vcLink             String?
      createdUserId      Int
      user               User                 @relation(fields: [createdUserId], references: [id])
      createdAt          DateTime             @default(now())
      updatedAt          DateTime             @updatedAt
      WorkoutsAssignment WorkoutsAssignment[]
    }
    
    

    我运行的cmd npx prisma migrate dev

    错误显示如下

    Environment variables loaded from .env
    Prisma schema loaded from prisma/schema.prisma
    Datasource "db": MySQL database "dev-fitish-v2" at "***n.com:25060"
    
    Error: P3014
    
    Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow
    
    Original error: Error code: P1010
    
    User `fitish` was denied access on the database `dev-fitish-v2`
    

    如果我运行的cmd npx prisma db push

    错误是这样显示的。。

    Environment variables loaded from .env
    Prisma schema loaded from prisma/schema.prisma
    Datasource "db": MySQL database "dev-fitish-v2" at "***n.com:25060"
    Error: REFERENCES command denied to user 'fitish'@'*.*.*.*' for table 'dev-fitish-v2.User'
       0: sql_schema_connector::apply_migration::migration_step
               with step=AddForeignKey { foreign_key_id: ForeignKeyId(0) }
                 at schema-engine/connectors/sql-schema-connector/src/apply_migration.rs:21
       1: sql_schema_connector::apply_migration::apply_migration
                 at schema-engine/connectors/sql-schema-connector/src/apply_migration.rs:10
       2: schema_core::state::SchemaPush
                 at schema-engine/core/src/state.rs:433
    

    如何解决这个问题。。。。

    我想在我的服务器数据库中灵活地迁移模式模型

    2 回复  |  直到 1 年前
        1
  •  0
  •   Darko    1 年前

    为什么要注释掉影子数据库设置?

    影子数据库是一个与您的数据库具有相同架构/结构的数据库。如果您更改 prisma.schema 文件并运行migrate命令,它会将您的数据库与影子数据库进行比较,然后创建一个迁移SQL文件。

    您需要在数据库服务器中创建一个名为的影子数据库 <your-db-name>-shadow ,并删除影子数据库设置的注释。

    请逐一运行以下2个命令。

    npx prisma migrate dev --create-only
    npx prisma migrate deploy
    

    第一个命令将创建一个包含用于迁移的SQL命令的SQL文件,第二个命令将该SQL文件应用于实际数据库。

        2
  •  0
  •   Kossi D. T. S.    1 年前

    我认为您的Prisma数据库用户(fitish)无权自行创建新数据库。

    据我所知,Prisma需要两个数据库来确保数据一致性(至少在开发过程中):

    • 主数据库和
    • 影子数据库(基本上是主数据库的副本) 我认为Primas在将迁移和模式更改应用到主数据库之前,会在内部使用影子数据库来验证这些更改。

    由于我不想给Prisma无限的权限,我手动创建了两个独立的数据库,并按如下方式配置Prisma(schema.Prisma):

    generator client {
      provider = "prisma-client-js"
    }
    
    datasource db {
      provider          = "mysql"
      url               = env("DATABASE_URL")
      shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
    }
    // ...
    

    我给了Prisma所需的权限,但仅限于这两个数据库。

    以下是详细说明 about the shadow database | Prisma Documentation 。我希望这能有所帮助。