blog.unresolved.xyz
Wed Jul 08 2020

Prisma再入門

  • JavaScript
Prisma再入門

Rails使うのやめるゆうて1年ほど過ぎました。

そうなるとバックエンドを何で書くんだって話になってとりあえずTSを選んだんだけど、どの言語を選んでも付きまとうのがマイグレーションやORMで、結局Prisma勉強したほうがいいわってことで再入門することにした。

とはいえ覚えることが結構多かったので写経ついでにメモもしておいて記憶を定着させたい。

チュートリアル

Prisma、MigrationもExperimentalで利用可能になっていて、チュートリアルもそれぞれ用意されてる。

実際はほぼ同じことが書いてあるんだけど、前者がMigrationを含まない場合のチュートリアルで、やってることはこの図を見るとわかりやすい。

f7itiYw

Introspect your database with Prisma より引用。

DBに定義されているテーブルデータをPrismaが読み取ってスキーマファイルを吐き出すのがメインの処理で、 prisma introspect コマンドで実現されてる。

スキーマファイルはドキュメントにある通りこんなのが吐き出される。

model Post {
  id        Int      @default(autoincrement()) @id
  createdAt DateTime @default(now())
  title     String
  content   String?
  published Boolean  @default(false)
  User      User     @relation(fields: [authorId], references: [id])
  authorId  Int
}
model Profile {
  id     Int     @default(autoincrement()) @id
  bio    String?
  User   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}
model User {
  id      Int      @default(autoincrement()) @id
  email   String   @unique
  name    String?
  Post    Post[]
  Profile Profile?
}

@prisma/client

@prisma/client は最初なんだかよくわからなかったんだけど、Prismaがスキーマを読み込んでJS上でORMのように振る舞うための情報を生成したりメソッドの提供をするライブラリっぽい。

ちょっと不思議な挙動をするんだけど、 prisma generate コマンドを実行すると node_modules/.prisma にスキーマファイルから生成したORM用のメソッド群を持つモジュールを吐き出すっぽい。

FensWfo

Install and generate Prisma Client より引用。

マイグレーション

ここがおもに覚えたかったやつ。まあどうせnpm scriptにしちゃうけど。

  • マイグレーションの新規作成: npx prisma migrate save --experimental
    • npx prisma migrate save --name init --experimental で同時に名前を指定しちゃうこともできる
    • rails g migration と同義
  • DBへの反映: npx prisma migrate up --experimental
    • rails db:migrate と同義

マイグレーションファイルは以下みたいなDSLだけど、まあ読みやすいし覚えることに抵抗はなさそう。ゆうてRailsのマイグレーションファイルもめっちゃわかりやすいわけではないし。

model Post {
  id        Int      @default(autoincrement()) @id
  createdAt DateTime @default(now())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}
model Profile {
  id     Int     @default(autoincrement()) @id
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}
model User {
  id      Int      @default(autoincrement()) @id
  email   String   @unique
  name    String?
  posts   Post[]
  profile Profile?
}

ようは prisma introspect で吐き出されるものと全く同じやつ。

あとはPrismaで1プロダクト作って肌感身につけたいところ〜。

Author
Daisuke Tsuji

Daisuke Tsuji

フリーのWeb Developer。

RubyとかRailsを触ってる時間が多い。コーディングもマークアップもライティングもデザインもSEOもやるタイプ。

だいたいどれもだめ。業務委託のお仕事募集中。