💻

【Prisma】prisma migrate でエラーが出るので解決していく

2025/01/11に公開

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 の権限が必要な理由

エラー文の中にある ↓ のサイトを見てみます

https://www.prisma.io/docs/concepts/components/prisma-migrate/shadow-database

シャドウデータベースを作成するために CREATEDB が必要とのことです。

必要な権限について確認したい方は ↓ を見てみてください

https://www.prisma.io/docs/concepts/components/prisma-migrate/shadow-database#shadow-database-user-permissions

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.

https://www.postgresql.org/docs/12/sql-createrole.html

https://eng-entrance.com/postgresql-role

https://qiita.com/nuko_yokohama/items/085b75ee4c0938936ab9

エラー ②:no schema has been selected to create in

https://www.postgresql.jp/document/9.4/html/sql-grant.html

https://qiita.com/kkk777/items/dfb2ffb103a5f5ab2cdb

https://www.javadrive.jp/postgresql/role/index3.html

Discussion