15
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Prismaのschema定義で、DBのカラム名はsnake_caseだけど実際に使う時はcamelCaseにしたい人へのライフハック

Last updated at Posted at 2023-05-12

結論

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で使いたい人へのライフハックを投稿します。(時間ができたら)

15
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?