Site icon image World Hacker(ぎょうざブログ)

Think Different, Connect Dots for Line.

【Tips - Prisma】実例でわかるシリーズ

<前置き、挨拶>

みなさんどうも、こんばんみ~。ぎょうざです。

Webアプリ上などでデータベースとのやりとりを実装する際に便利なツール

Prisma(プリズマ)を利用する際に、ぎょうざが躓いたところを備忘録として記録しておきます。

同じようなケースあるいは現象で困っている方の参考になれば幸いです。

(※最終更新:2024/10/03)

【目次】

<Useful>

▶ Supabaseデータベースとの接続(Transaction ModeとSession Modeの使い分け)

重要と思うポイントのみ

  • DATABASE_URL には Transaction Mode のコネクションURI、 DIRECT_URL には Session Mode のコネクションURL
  • Transaction Mode では pgbouncer=true を環境変数としてURL内に追記することを推奨
  • 開発環境の Transaction Mode では更に connection_limit=1 も指定することを推奨

Supabase上でデータベースをPostgreSQLで作成した場合のDATABASE_URL例:

postgresql://[データベースのUser]:[データベースのPassword]@[データベースのHost]:[Port]/postgres?pgbouncer=true&connection_limit=1

prisma db pushしても動かない、いつまでも終わらない
  • 前提:接続先BD(Supabase)、Supabase側ですでにスキーマの定義していないDBを作成済み
    • 試したこと、確認したこと▶Supabase側でDBの再作成、DBパスワード再生成
    • ?▶Sission ModeでDBに接続するポート番号が『6543』のままだった。。。指定されている『5432』に修正後、無事にdb push成功

▶ Full-Text Search を PostgreSQL (on Supabase) で使えるようにしたい

<Error>

▶ (@Supabase)prepared statement “s1” already exists
  • 現象:
  • 原因:
  • 解決策:

<Warn>

prisma migrate dev --name add_full_text_searchでデータが全て消える可能性もあり
Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": PostgreSQL database "postgres", schema "public" at "(supabaseのデータベースURL)"

Drift detected: Your database schema is not in sync with your migration history.

The following is a summary of the differences between the expected database schema given your migrations files, and the actual schema of the database.

It should be understood as the set of changes to get from the expected schema to the actual schema.

If you are running this the first time on an existing database, please make sure to read this documentation page:
https://www.prisma.io/docs/guides/database/developing-with-prisma-migrate/troubleshooting-development

[+] Added tables
  - Attachment
  - Category
  - Chapter
  - Course
  - MuxData
  - Purchase
  - StripeCustomer
  - UserProgress

[*] Changed the `Attachment` table
  [+] Added index on columns (courseId)

[*] Changed the `Category` table
  [+] Added unique index on columns (name)

[*] Changed the `Chapter` table
  [+] Added index on columns (courseId)

[*] Changed the `Course` table
  [+] Added index on columns (categoryId)

[*] Changed the `MuxData` table
  [+] Added unique index on columns (chapterId)



[*] Changed the `Purchase` table


[*] Changed the `Purchase` table
  [+] Added index on columns (courseId)

[*] Changed the `Purchase` table


[*] Changed the `Purchase` table
  [+] Added index on columns (courseId)

[*] Changed the `StripeCustomer` table
  [+] Added unique index on columns (srripeCustomerId)

[*] Changed the `UserProgress` table
  [+] Added index on columns (chaperId)
  [+] Added unique index on columns (userId, chaperId)

√ We need to reset the "public" schema at "(supabaseのデータベースURL)"
Do you want to continue? All data will be lost. ... yes

Applying migration `20241003024904_add_full_text_search`

The following migration(s) have been created and applied from new schema changes:

migrations/
  └─ 20241003024904_add_full_text_search/
    └─ migration.sql

Your database is now in sync with your schema.

✔ Generated Prisma Client (v5.17.0) to .\node_modules\@prisma\client in 94ms

〆の一言

Prismaは、データベースとやり取りする中間ツールとして、とても優秀です!
Node.js環境で利用できるオープンソースのORM(Object Relational Mapping)として
どんなデータベースを利用しているかを開発者が意識する必要がなく、
共通のオブジェクトメソッドを活用することで、簡単なデータベース操作が可能になります。


ここまで読んでいただき、ありがとうございました。

以上、ぎょうざでした。