はじめに
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
と書いていかないといけないので多少の違和感があってもそのまま使うのが良かったり、悪かったり。。。