Blitzを使用する際にデータベースのテーブル名やカラム名の命名規則を修正する

Blitzを使用する際にデータベースのテーブル名やカラム名の命名規則を修正する

2021年08月20日

BlitzPrisma
Blitz+Prisma+Database

はじめに

Blitzでは永続化の処理にPrisma2が使用されているのですが、デフォルトで作成されるデータベースのテーブル名が単数のパスカルケースになっていたり、カラム名がキャメルケースになっていたりしていて推奨されている?のですが自分的に違和感があり合わなかったので修正する方法をメモしておきます。

結論

結論から行くとPrismaのスキーマを作成する際に@map(カラム名)@@map(テーブル名)で指定するだけとなります。それだけでデータベースは自分好みの命名規則に合わせられ、TS(JS)側の修正は不要になります。

フィールド名そのものを修正することでTS(JS)側の命名規則も修正できるのですが、デフォルトの命名規則でBlitzのコア(セッション周りなど)で記述されていたりするので修正するのは骨が折れるかと思いますのでTS(JS)側の命名規則はそのままで統一した方が良いかと思います。

環境

  • Blitz:0.39.0

マイグレーションファイルの削除

Blitzのプロジェクトを作成するとデフォルトでマイグレーションファイルが作成されていて命名規則は上記のテーブル名が単数のパスカルケース、カラム名がキャメルケースとなっています。こちらは不要になるのでとりあえず削除しておきます。

スキーマの修正

上記でも書いたとおり@map, @@mapを記述していくだけとなります。 Prisma2の属性として@id,@unique,@@mapなどいくつか定義されているのですが、@が一つのものはフィールド用の属性、@@のように@が2つのものはモデル用の属性となっていて、それぞれカラム名、テーブル名にマッピングされるようになります。

その他の属性は ここ に書かれています。

TS(JS)側ではPrismaスキーマのフィールド名で操作するのでカラム名やテーブル名を変更してもTS(JS)側は変更する必要はありません。

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

// --------------------------------------

model User {
  id             Int      @id @default(autoincrement())
  createdAt      DateTime @default(now()) @map("created_at")
  updatedAt      DateTime @updatedAt @map("updated_at")
  name           String?
  email          String   @unique
  hashedPassword String?  @map("hashed_password")
  role           String   @default("USER")

  tokens   Token[]
  sessions Session[]

  @@map("users")
}

model Session {
  id                 Int       @id @default(autoincrement())
  createdAt          DateTime  @default(now()) @map("created_at")
  updatedAt          DateTime  @updatedAt @map("updated_at")
  expiresAt          DateTime? @map("expires_at")
  handle             String    @unique
  hashedSessionToken String?   @map("hashed_session_token")
  antiCSRFToken      String?   @map("anti_csrf_token")
  publicData         String?   @map("public_data")
  privateData        String?   @map("private_data")

  user   User? @relation(fields: [userId], references: [id])
  userId Int?  @map("user_id")

  @@map("sessions")
}

model Token {
  id          Int      @id @default(autoincrement())
  createdAt   DateTime @default(now()) @map("created_at")
  updatedAt   DateTime @updatedAt @map("updated_at")
  hashedToken String   @map("hashed_token")
  type        String
  // See note below about TokenType enum
  // type        TokenType
  expiresAt   DateTime @map("expires_at")
  sentTo      String   @map("sent_to")

  user   User @relation(fields: [userId], references: [id])
  userId Int  @map("user_id")

  @@unique([hashedToken, type])
  @@map("tokens")
}

// NOTE: It's highly recommended to use an enum for the token type
//       but enums only work in Postgres.
//       See: https://blitzjs.com/docs/database-overview#switch-to-postgresql
// enum TokenType {
//   RESET_PASSWORD
// }

マイグレーション

以下を実行してデータベースに反映します。デフォルトはSQLiteです。

データが消えますという警告が出ますが「y」を入力します。

またマイグレーション名の入力も求められますがこちらは適宜わかりやすい名前をつけます。

$ blitz prisma generate
$ blitz prisma migrate dev
...
Do you want to continue? All data will be lost. … yes
✔ Enter a name for the new migration: … create_initial_table

db/migrations配下にできているsqlの命名規則が変わっていれば完了です。

おわりに

デフォルトの命名規則はPrismaの思想なのかな? わざわざ@map,@@mapと書いていかないといけないので多少の違和感があってもそのまま使うのが良かったり、悪かったり。。。

ホーム記事一覧プライバシーポリシーお問い合わせ
© 2024 luku.work