💻
【Prisma】prisma migrate でエラーが出るので解決していく
prisma migrate を実行したのですが、いくつかエラーが出ました。
対応した記録を記事として残しておきます。
現状
Next.js のアプリに Prisma をインストールし、PostgreSQL の Docker コンテナに接続します
バージョン
バージョン | |
---|---|
Prisma | 5.2.0 |
Node.js | 18.17.0 |
Next.js | 13.4.19 |
Docker | 20.10.21 |
PostgreSQL | 15.4 |
エラー ①:Prisma Migrate could not create the shadow database.
エラー文
sample-prisma-app$ npx prisma migrate dev --name init
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432"
Error: P3014
Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow
Original error:
db error: ERROR: permission denied to create database
at schema-engine/core/src/state.rs:270
db error: ERROR: permission denied to create database
と出ているので、Database を作成する権限が足りてないようですね。
でも、その権限ってなんで必要なんでしょう??
CREATEDB の権限が必要な理由
エラー文の中にある ↓ のサイトを見てみます
シャドウデータベースを作成するために CREATEDB が必要とのことです。
必要な権限について確認したい方は ↓ を見てみてください
CREATEDB の権限を付与する
PostgreSQL にログインして、Prisma が使用するユーザーに権限を付与します。
私の場合は、Prisma が PostgreSQL で使用するのは
- USER:prismauser
- DB:prismadb
なので、下記のようにコマンドを実行しました。
// PostreSQLコンテナにログイン
$ docker exec -it postgres psql -U prismauser prismadb
psql (15.4 (Debian 15.4-1.pgdg120+1))
Type "help" for help.
// prismauserにCREATEDBの権限を追加
prismadb=> ALTER ROLE prismauser CREATEDB;
// 権限確認
prismadb=> \du;
List of roles
Role name | Attributes | Member of
------------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
prismauser | Create DB | {}
// 付与されていますね!
// ログアウト
prismadb=> exit
権限が付与されたので、再度 prisma migrate してみます
エラー ②:no schema has been selected to create in
エラー文
sample-prisma-app$ npx prisma migrate dev --name init
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432"
Error: db error: ERROR: no schema has been selected to create in
0: sql_schema_connector::sql_migration_persistence::initialize
with namespaces=None
at schema-engine/connectors/sql-schema-connector/src/sql_migration_persistence.rs:14
1: schema_core::state::ApplyMigrations
at schema-engine/core/src/state.rs:201
エラー文でいろいろ調べてみると、スキーマに対する USAGE の権限がないことが原因っぽい
USAGE:対象がスキーマの場合、それに含まれるオブジェクトへのアクセスを許可
の権限になります
USAGE をユーザーへ付与
こちらも Prisma が使用するユーザーへ権限を付与していきます。
私の場合は、Prisma が PostgreSQL で使用するのは
- USER:prismauser
- DB:prismadb
- SCHEMA:prismaschema
なので、下記のようにコマンドを実行しました。
// スーパーユーザーでログイン
sample-prisma-app$ docker exec -it postgres psql -U postgres prismadb
psql (15.4 (Debian 15.4-1.pgdg120+1))
Type "help" for help.
// 権限を確認
//
prismadb=# \dn+ prismaschema;
List of schemas
Name | Owner | Access privileges | Description
--------------+----------+-----------------------+-------------
prismaschema | postgres | postgres=UC/postgres +|
| | prismauser=C/postgres |
(1 row)
// USAGE権限をprismauserに付与
prismadb=# GRANT USAGE ON SCHEMA prismaschema TO prismauser;
GRANT
// 権限確認
// prismauser=C/postgres ⇒ prismauser=UC/postgres になっていればOK
prismadb=# \dn+ prismaschema;
List of schemas
Name | Owner | Access privileges | Description
--------------+----------+------------------------+-------------
prismaschema | postgres | postgres=UC/postgres +|
| | prismauser=UC/postgres |
(1 row)
// ログアウト
prismadb=# exit
解決しました
再度、prisma migrate してみます
sample-prisma-app$ npx prisma migrate dev --name init
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432"
Applying migration `20230903073559_init`
The following migration(s) have been created and applied from new schema changes:
migrations/
└─ 20230903073559_init/
└─ migration.sql
Your database is now in sync with your schema.
Running generate... (Use --skip-generate to skip the generators)
added 2 packages, and audited 334 packages in 7s
117 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
✔ Generated Prisma Client (v5.2.0) to ./node_modules/@prisma/client in 343ms
無事通りましたーー
参考文献
エラー ①:Prisma Migrate could not create the shadow database.
エラー ②:no schema has been selected to create in
Discussion