結論
prisma-case-format
を使おう!
https://github.com/iiian/prisma-case-format
ってちょっと色々すっ飛ばしましたが、この題名だけみて結論だけ知りたい人は多分このリポジトリ見たらざっくりわかると思うのでこれだけでわかる人は「いいね」だけ気持ち押してくれればこの後ぜーーーーんぶすっ飛ばして「最後に」だけ流しよみしてくれればOKです。
ちょっとこれだけ見ても・・・って人は読み進めてもらえると大体わかると思います。
前提
DBの設計するときって大体は・・・
Table名・カラム名共にsnake_caseで書くことが多いと思います。これは、DBによって大文字小文字の判別をしないため判読性にかけるという理由からsnake_caseにするという一説があります。(無論諸説&慣習あり。)
けど、Typescript使ってる人って割と、classはPascalCase、変数名などはcamelCaseで書きたい人も一定数いるはずで、一貫した記法をしようとすると結構厄介だったりします。
ここではその厄介をできる限り解消したい人へのTipsです。
そもそもsnake_caseのカラム名をcamelCaseに変換したい時の書き方
https://www.prisma.io/docs/concepts/components/prisma-schema/data-model
公式を見ろ!というのは投げやりなので、ちゃんと説明します。
以下のような書き方で、@map("hoge_hoge")
という書き方でmapに記載された方でカラム名が設定されます。
同時に、@@map("huga_huga")
の書き方でテーブル名がマッピングされます。
model Users {
id String @id @default(uuid())
name String
email String
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("users")
}
これによって、このmodelを呼び出す時は、、、
const prisma = new Prisma.client()
const exec = async () => {
const users = await prisma.users.findMany() // これの戻り値が定義された通りのキャメルケースになります。
}
ここで声を大にして言いたいです。
この@map
と@@map
書くのめんどくさくね?!
これが一つや二つなら手直しでもいいのですが、複数あると面倒ですよね?(面倒でないと思う人はこの先ほぼ無駄になるかも...)
面倒だと思う人はこれを使おう!
てれれってれー、prisma-case-format
。
例えば先ほどのusersについて・・・・
model Users {
id String @id @default(uuid())
name String
email String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
と描いてあるmodelを先ほどのprisma-case-formatを噛ませると
model Users {
id String @id @default(uuid())
name String
email String
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("users")
}
に自動で変換されます。私のリポジトリではprisma generate
する前に以下のコマンドを実行します。(package.json
のスクリプトで定義してます。)
prisma-case-format --file prisma/schema.prisma && prisma format && prisma generate
こうすることで自動でsnake_caseでTable定義をつくり、実際に@prisma/client
を使う時はcamelCaseで使えるようにしています。
最後に
めんどくさいと思っていることは大体の場合は世界の誰かも同じようにめんどくさいと思ってるものですね・・・。
先人の知恵とツールに感謝してリポジトリにスターをつけた後、感謝の正拳突き1024回をしたのちに使用しましょう(感謝とスターは本当にしますが、正拳突きは冗談です。)
次回時間がある時にHasuraのGraphqlの定義をcamelCaseで使いたい人へのライフハックを投稿します。(時間ができたら)