Prisma Next-Auth PlanetScale:不允许外键约束



我按照官方文档设置next-auth与prisma: https://next-auth.js.org/adapters/prisma。将这些模型(Session, Account, VerificationToken)复制到我的schema.prisma后,当我尝试执行prisma db push时,我得到以下错误。

我错过了什么吗?如何纠正此问题?

npx prisma db push:

Error: foreign key constraints are not allowed, see https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/
0: sql_migration_connector::apply_migration::migration_step
with step=AddForeignKey { foreign_key_id: ForeignKeyId(0) }
at migration-engine/connectors/sql-migration-connector/src/apply_migration.rs:21
1: sql_migration_connector::apply_migration::apply_migration
at migration-engine/connectors/sql-migration-connector/src/apply_migration.rs:10
2: migration_core::state::SchemaPush
at migration-engine/core/src/state.rs:381

server/prisma/schema.prisma:

datasource db {
provider = "mysql"
// NOTE: When using postgresql, mysql or sqlserver, uncomment the @db.Text annotations in model Account below
// Further reading:
// https://next-auth.js.org/adapters/prisma#create-the-prisma-schema
// https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string
url      = env("DATABASE_URL")
// relationMode = "prisma"
}
generator client {
provider = "prisma-client-js"
}
model Account {
id                String  @id @default(cuid())
userId            String
type              String
provider          String
providerAccountId String
refresh_token     String? @db.Text
access_token      String? @db.Text
expires_at        Int?
token_type        String?
scope             String?
id_token          String? @db.Text
session_state     String?
user              User    @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
model Session {
id           String   @id @default(cuid())
sessionToken String   @unique
userId       String
expires      DateTime
user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}
enum Role {
hacker
mentor
sponsor
}
model User {
id       String    @id @default(cuid())
email    String    @unique
password String
role     Role      @default(hacker)
accounts  Account[]
sessions  Session[]
}
model VerificationToken {
identifier String
token      String   @unique
expires    DateTime
@@unique([identifier, token])
}

添加relationMode = "prisma"datasource db允许我成功运行npx prisma db push,但随后我的@relations在vscode中显示错误,当我将光标悬停在它上面时显示:

With `relationMode = "prisma"`, no foreign keys are used, so relation fields will not benefit from the index usually created by the relational database under the hood. This can lead to poor performance when querying these fields. We recommend adding an index manually. Learn more at https://pris.ly/d/relation-mode-prisma-indexes" 

我不太确定这是什么意思,但我想我想保留这些@relations,而不是"手动"操作。如错误所示。

解决方案

  1. 取消数据库节点中relationMode = "prisma"的注释。
  2. 运行npx prisma format→你会注意到一堆警告
  3. AccountSession中添加@uniqueuserId
  4. 适用于npx prisma db push

资源
  • https://www.prisma.io/docs/guides/database/planetscale how-to-emulate-relations-in-prisma-client

    PlanetScale不允许在其数据库模式中使用外键默认情况下,Prisma在底层数据库中使用外键来强制Prisma模式中字段之间的关系。在Prisma 3.1.1及以后的版本中,您可以使用Prisma关系模式在Prisma Client中模拟关系,从而避免了在数据库中使用外键的需要。

    要在Prisma Client中启用关系仿真,将relationMode字段设置为" Prisma "在数据源块

  • https://www.prisma.io/docs/guides/database/planetscale differences-to-consider

    在Prisma中模拟关系时,需要在外键上创建索引。在标准的MySQL数据库中,如果表中有一个列带有外键约束,则会在该列上自动创建索引。因为PlanetScale不支持外键当Prisma Client模拟关系时,目前没有创建这些索引,这可能导致问题查询没有得到很好的优化。为了避免这种情况,您可以在Prisma中创建索引。有关更多信息,请参见如何在外键上创建索引。

  • https://www.prisma.io/docs/concepts/components/prisma-schema/relations/relation-mode索引

    棱镜关系模式不使用外键因此,当您使用Prisma Migrate或db push将更改应用到数据库时,不会创建索引。相反,您需要在关系标量字段上手动添加索引。使用@@index属性(或@unique、@@unique或@@id属性,如果适用)。

PlanetScale不支持使用外键。

使用Prisma,您可以在数据中维护这些关系,并允许使用引用操作,通过使用Prisma在Prisma Client中使用Prisma关系模式模拟关系的能力。有关更多信息,请参见如何在Prisma Client中模拟关系。

相关内容

  • 没有找到相关文章

最新更新