2024-07-06
【Tips - Prisma】実例でわかるシリーズ
<前置き、挨拶>
みなさんどうも、こんばんみ~。ぎょうざです。
Webアプリ上などでデータベースとのやりとりを実装する際に便利なツール
Prisma(プリズマ)を利用する際に、ぎょうざが躓いたところを備忘録として記録しておきます。
同じようなケースあるいは現象で困っている方の参考になれば幸いです。
(※最終更新:2024/10/03)
【目次】
<Useful> ▶ Supabaseデータベースとの接続(Transaction ModeとSession Modeの使い分け) ▶ prisma db pushしても動かない、いつまでも終わらない <Error> ▶ (@Supabase)prepared statement “s1” already exists <Warn> ▶ prisma migrate dev --name add_full_text_searchでデータが全て消える可能性もあり 〆の一言
<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) で使えるようにしたい
- 現象:Prismaのproviderを
”postgresql”
に設定すると、model内に@@fulltext
を定義するとエラーを吐く。(※providerが”mysql”
だとエラーを吐かない) - 原因:(2024/10/03時点) PostgreSQLに対応していない(参考:https://github.com/prisma/prisma/issues/8950)
(※公式ドキュメント:https://www.prisma.io/docs/orm/prisma-client/queries/full-text-search)generator client { provider = "prisma-client-js" // 以下を追記する previewFeatures = ["fullTextSearch"] }
- 解決策:上記の公式ドキュメントにある追記をした上で、こちらもやってみた▶https://www.pedroalonso.net/blog/postgres-full-text-search/#4-using-prisma-with-postgresql-full-text-search-a-nameprisma-integrationa)
<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)として
どんなデータベースを利用しているかを開発者が意識する必要がなく、
共通のオブジェクトメソッドを活用することで、簡単なデータベース操作が可能になります。
ここまで読んでいただき、ありがとうございました。
以上、ぎょうざでした。