我按照官方文档设置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
,但随后我的@relation
s在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"
我不太确定这是什么意思,但我想我想保留这些@relation
s,而不是"手动"操作。如错误所示。
解决方案
- 取消数据库节点中
relationMode = "prisma"
的注释。 - 运行
npx prisma format
→你会注意到一堆警告 - 在
Account
和Session
中添加@unique
到userId
- 适用于
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中模拟关系。