Delete lots of entries results in a timeout - prisma

When I run:
const results = await prisma.result.deleteMany({
where: {
typebotId: 'ckzqqer3j002509l3np5x3v2y',
},
})
It runs forever and then times out. (I'm expecting it to delete more than 6.000 results)
Here is my prisma schema:
model Typebot {
id String #id #default(cuid())
createdAt DateTime #default(now())
updatedAt DateTime #default(now()) #updatedAt
icon String?
name String
publishedTypebotId String?
publishedTypebot PublicTypebot?
results Result[]
folderId String?
folder DashboardFolder? #relation(fields: [folderId], references: [id])
groups Json
variables Json[]
edges Json
theme Json
settings Json
publicId String? #unique
customDomain String? #unique
collaborators CollaboratorsOnTypebots[]
invitations Invitation[]
webhooks Webhook[]
workspaceId String
workspace Workspace #relation(fields: [workspaceId], references: [id], onDelete: Cascade)
}
model Result {
id String #id #default(cuid())
createdAt DateTime #default(now())
updatedAt DateTime #default(now()) #updatedAt
typebotId String
typebot Typebot #relation(fields: [typebotId], references: [id], onDelete: Cascade)
answers Answer[]
variables Json[]
isCompleted Boolean
logs Log[]
}
model Log {
id String #id #default(cuid())
createdAt DateTime #default(now())
resultId String
result Result #relation(fields: [resultId], references: [id], onDelete: Cascade)
status String
description String
details String?
}
model Answer {
createdAt DateTime #default(now())
resultId String
result Result #relation(fields: [resultId], references: [id], onDelete: Cascade)
blockId String
groupId String
variableId String?
content String
##unique([resultId, blockId, groupId])
}
Here are the logs:
prisma:info Starting a postgresql pool with 21 connections in PgBouncer mode.
Query: BEGIN
Params: []
Duration: 10ms
Query: DEALLOCATE ALL
Params: []
Duration: 11ms
Query: SELECT "public"."Result"."id" FROM "public"."Result" WHERE "public"."Result"."typebotId" = $1 OFFSET $2
Params: ["ckzqqer3j002509l3np5x3v2y",0]
Duration: 159ms
Query: SELECT "public"."Result"."id" FROM "public"."Result" WHERE "public"."Result"."typebotId" = $1
Params: ["ckzqqer3j002509l3np5x3v2y"]
Duration: 129ms
Query: DELETE FROM "public"."Result" WHERE "public"."Result"."id" IN ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$70,$71,$72,$73,$74,$75,$7 [...] 0","cl4frxblq433409lb3l95czep","cl4frgs4r487909ks862a3vf2","cl4frww25009609mpgbv0ntqf","cl4frgs0u487309ks3ugw514j","cl4frgsvn097909k0epcxy9me","cl4frhil4108309k0pop31n8p","cl4frwwa1313909k0vfb9tpbo","cl4frgx5l282409lbvdk1gwz1","cl4frgzc2100209k0k8ve0471","cl4frx4pi429709lbhpekm640","cl4frhu63294109lbbxsclv2l","cl4frjhk9307309lbm8e02obi","cl4frx5nl643709kst8fmob1e","cl4frx984432009lbmp3sxqd6","cl4frkjiq142909k0n37881vv","cl4frjihk310109lb6tnne9jc","cl4frxffr436209lbkaj3gh9f","cl4frkkd7145209k051m5bflf"]
Duration: 120041ms
Query: ROLLBACK
Params: []
Duration: 11ms
How can I optimize this query?
I also tried:
const results =
await prisma.$queryRaw`DELETE FROM "Result" WHERE "Result"."typebotId"='ckzqqer3j002509l3np5x3v2y'`
It also times out 😔

Related

Multiple relation to the same field prisma postgresql

I want to create this database deisng https://i.stack.imgur.com/2QYip.png
I need to make model of Station and TrackSegment (A track segment ties two stations together.)
This is my prisma schema but it give me this error "Error validating model 'station': the unique index definitions refers to the field code multiple times.
model Station {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
name String
code String #unique
}
model TrackSegment {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
sourceId String
destinationId String
stationCode Station #relation(fields: [destinationId, sourceId], references: [code, code])
}
I imagine this is how the data will look.
Station: [
{
name: 'kalisetail'
code: 'KLS
},
{
name: 'rogojampi'
code: 'RGJ
}]
then the TrackSegment is
id: 1
sourceId: KLS
destinationId: RGJ
both sourceId and destinationId refer to the same field(code) of model Station
You will need to add a second Station relation on your TrackSegment field to differentiate between the source the destination.
model Station {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
name String
code String #unique
sourceSegments TrackSegment[] #relation("source")
destinationSegments TrackSegment[] #relation("destination")
}
model TrackSegment {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
sourceId String
destinationId String
sourceStationCode Station #relation(name: "source", fields: [sourceId], references: [code])
destinationStationCode Station #relation(name: "destination", fields: [destinationId], references: [code])
}
Notice I have always disambiguated the relations by giving them different names.

prisma nested writes throw unknown args

I have the shorten schema like that:
model PATIENT {
patient_id Int #id #default(autoincrement())
patient_name String
patient_identity_card BigInt #unique
password String
wallet_id Int?
birthday DateTime
address String
status_id Int
gender String #default("Nam")
phone String #default("0935438280")
current_treatment_place_id Int
avatar_url String?
treatment_place TREATMENT_PLACE #relation(fields: [current_treatment_place_id], references: [place_id])
status PATIENT_STATUS #relation(fields: [status_id], references: [status_id])
card CART?
patient_passive_contact PATIENT_CONTACT[] #relation("ActiveContact_referredToPatient")
patient_active_contact PATIENT_CONTACT[] #relation("PassiveContact_referredToPatient")
BE_MANAGED_HISTORY BE_MANAGED_HISTORY[]
}
model BE_MANAGED_HISTORY {
place_id Int
patient_id Int
time DateTime
status_id Int
status PATIENT_STATUS #relation(fields: [status_id], references: [status_id])
patient PATIENT #relation(fields: [patient_id], references: [patient_id])
place TREATMENT_PLACE #relation(fields: [place_id], references: [place_id])
change_type_id Int
change_type CHANGE_MANAGED_HISTORY_TYPE #relation(fields: [change_type_id], references: [type_id])
##id([place_id, patient_id, time])
}
I want to create a BE_MANAGED_HISTORY record and through it create a PATIENT record with needed information. The nested writes below:
const res = await prisma.BE_MANAGED_HISTORY.create({
data: {
place_id: treatmentPlaceId,
time: new Date(startDate),
status_id: patientStatus,
change_type_id: 1,
patient: {
create: {
patient_name: patientName,
gender,
birthday: new Date(birthday),
patient_identity_card: identity,
password: hashedPassword,
phone,
address,
status_id: patientStatus,
current_treatment_place_id: treatmentPlaceId,
avatar_url: avatarUrl,
}
}
},
})
But prisma throws an error:
Unknown arg patient in data.patient for type BE_MANAGED_HISTORYUncheckedCreateInput. Did you mean patient_id?
Argument patient_id for data.patient_id is missing.
So can I create an beManagedHistory and create an patient inside nested writes?
We have to create a PATIENT record first, and nested in it creating a BE_MANAGED_HISTORY record.

How to make id autoincrement in schema.prisma?

I am writing a postgreSQL database. The ID must be auto-incrementing.
model User {
id String #id #default(cuid())
name String?
email String? #unique
emailVerified DateTime? #map("email_verified")
image String?
createdAt DateTime #default(now()) #map(name: "created_at")
updatedAt DateTime #updatedAt #map(name: "updated_at")
posts Post[]
accounts Account[]
sessions Session[]
##map(name: "users")
}
Result
If you write the ID manually, you can enter any value as in the first entry, but autocomplete generates the code as in the second entry. I got the code from the site Vercel.
You need to use autoincrement function.
Here's how it would look in User model:
model User {
id Int #id #default(autoincrement())
name String?
email String? #unique
emailVerified DateTime? #map("email_verified")
image String?
createdAt DateTime #default(now()) #map(name: "created_at")
updatedAt DateTime #updatedAt #map(name: "updated_at")
posts Post[]
accounts Account[]
sessions Session[]
##map(name: "users")
}

One-to-many and may-to-many relation between two prisma model

I am working on a side project and I came to an issue that I'm not sure how to solve. I have created two models, one for User and one for Project. The relation between them is many-to-many, as many users can have many projects, but i would also like to add a createdBy to the Project model, and this should be one-to-one as each project can only have one user who creates it. This is how my models are looking:
model User {
id String #id #default(cuid())
name String?
email String? #unique
emailVerified DateTime?
image String?
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
accounts Account[]
sessions Session[]
projects Project[]
Project Project[] #relation("userId")
}
model Project {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
name String
favourite Boolean #default(false)
archived Boolean #default(false)
users User[]
about String?
archivedAt String?
deletedAt String?
createdBy User #relation("userId", fields: [userId], references: [id])
userId String
}
The error that is getting from prisma migrate dev is
Step 1 Added the required column userId to the Project table without a default value. There are 2 rows in this table, it is not possible to execute this step.
Not sure what I am doing wrong as am pretty much a db modeling novice. Any help would be appreciated.
To achieve Many-to-Many with One-To-Many you need to set your schema.prisma file like:
model User {
id String #id #default(cuid())
name String?
email String? #unique
emailVerified DateTime?
image String?
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
projects Project[]
userProjects UserProjects[]
}
model Project {
id Int #id #default(autoincrement())
createdAt DateTime #default(now())
name String
favourite Boolean #default(false)
archived Boolean #default(false)
about String?
archivedAt String?
deletedAt String?
createdBy User #relation(fields: [user_id], references: [id])
user_id String
projectUsers UserProjects[]
}
model UserProjects {
project Project #relation(fields: [project_id], references: [id])
project_id Int
user User #relation(fields: [user_id], references: [id])
user_id String
##id([project_id, user_id])
}
It should migrate successfully.

prisma2 how to relate one-to-many and many-to-one?

I need some help to understqnd how to set my data modelisation.
What i'm trying to do is :
Reference a group ID in User model. A user can only be in one group, this is what i've done below.
Reference in Group Model all users that are inside a group. This is what I need help with.
model User {
id String #id #default(uuid())
email String #unique
role Role #default(USER)
group Group? #relation(fields: [group_id], references: [id], onDelete: SetNull)
group_id String
created_at DateTime #default(now())
updated_at DateTime #updatedAt
##map("user")
}
model Group {
id String #id #default(uuid())
name String
users User[]
created_at DateTime #default(now())
updated_at DateTime #updatedAt
deleted Boolean #default(false)
##map("group")
}
How can I make this list of User when I already have users User[] for the relation in User model ?
(BTW i've read the doc but i'm totally lost...)
I think your code is correct, you can use prisma-client to test
This is an example of this relation
model Agents {
id Int #id #default(autoincrement()) #db.UnsignedInt
name String? #db.VarChar(255)
owner String? #db.VarChar(255)
address String? #db.Text
lat String? #db.VarChar(10)
lng String? #db.VarChar(10)
tel String? #db.VarChar(13)
mobile String? #db.VarChar(11)
workTime String? #db.VarChar(255)
province Provinces #relation(fields: [provinceId], references: [id])
provinceId Int #db.UnsignedInt
createDateTime DateTime #default(now()) #db.Timestamp(0)
updateDateTime DateTime? #db.Timestamp(0)
##index([provinceId], name: "provinceId")
##map(name: "agents")
}
model Provinces {
id Int #id #default(autoincrement()) #db.UnsignedInt
name String? #db.VarChar(255)
coords String? #db.Text
createDateTime DateTime #default(now()) #db.Timestamp(0)
updateDateTime DateTime? #db.Timestamp(0)
agents Agents[]
##map(name: "provinces")
}