"Modern backend with TypeScript, PostgreSQL and Prisma" やってみる
#Prisma #TypeScript
動画:https://www.youtube.com/playlist?list=PLn2e1F9Rfr6k7ULe0gzQvtaXLoXrPqpki
記事:https://www.prisma.io/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1
指定されたリポジトリをクローンして、part-1ブランチに切り替え
prismaでの表現
1対多
リレーション元にはリレーション先[]型のフィールド
リレーション先にはInt型などでリレーションを保持するフィールドと、どうやってそれを保持するかを宣言する@relationを追加
code:schema.prisma
model Test {
testResults TestResult[] // relation field
}
model TestResult {
testId Int
test Test @relation(fields: testId, references: id)
}
testResults, testはPrismaクライアントからアクセスするための宣言で、実際のDBのフィールドではない
多対多
リレーション元、リレーション先それぞれにリレーション相手[]型のフィールド
code:schema.prisma
model User {
courses Course[]
}
model Course {
members User[]
}
多対多(中間モデル)
リレーション元、リレーション先それぞれに中間モデル[]型のフィールド
code:schema.prisma
model User {
courses CourseEnrollment[]
}
model Course {
members CourseEnrollment[]
}
model CourseEnrollment {
userId Int
user User @relation(fields: userId, references: id)
courseId Int
course Course @relation(fields: courseId, references: id)
@@id(userId, courseId)
@@index(userId, role)
}
この記事では@prisma/cliが使われてるけど現在はprismaにリネームされているらしい
prismaを入れたらエラーが出始めたので一旦@prisma/cliで続行
実際にデータをDBに追加するコードを書く
createなどはincludeオプションを追加すると取得や追加の結果にリレーション先が追加される
await prisma.モデル名.create({ data: {}, include: { フィールド名: true }})
気付かないところでパフォーマンスに影響出そうN+1とか
リレーションフィールドのオプション
create ... リレーション先を新規作成
connect ... 既存データに紐付け
await prisma.モデル名.aggregate()が型エラーで使えなかった
最新版にしたら型エラーは無くなったけどnpx prisma generateで別のエラーが出たので戻した
Prismaの素振りとしてはなかなか良かった
hapiが必要になったらPart2,3もまた見返したい