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.
エラー文
1 2 3 4 5 6 7 8 9 10 11 12 |
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://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/0d5175610119fd2c0a18c0b685ec6538.png)
About the shadow database | Prisma Documentation
About the shadow database
シャドウデータベースを作成するためにCREATEDBが必要とのことです。
必要な権限について確認したい方は↓を見てみてください
![](https://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/0d5175610119fd2c0a18c0b685ec6538.png)
About the shadow database | Prisma Documentation
About the shadow database
CREATEDBの権限を付与する
PostgreSQLにログインして、Prismaが使用するユーザーに権限を付与します。
私の場合は、PrismaがPostgreSQLで使用するのは
- USER:prismauser
- DB:prismadb
なので、下記のようにコマンドを実行しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 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
エラー文
1 2 3 4 5 6 7 8 9 10 11 |
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
なので、下記のようにコマンドを実行しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// スーパーユーザーでログイン 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してみます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/6f33cd15292e8020dca3b53c6385264d.png)
CREATE ROLE
CREATE ROLE CREATE ROLE — define a new database role Synopsis CREATE ROLE name option [ …
![](https://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/02c6e37e4593a9a4c38392baae30cb63.png)
【初心者向け】PostgreSQLのロールについて分かり易く解説
PostgreSQLで複数のユーザーやグループがデータベースを利用するにあたり、そのアクセス権限を取り決めて設定する必要がある。その際に設定するロールというものについて紹介する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9UG9zdGdyZVNRTCVFMyU4MSVBRSVFMyU4MyVBRCVFMyU4MyVCQyVFMyU4MyVBQiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9ODFhMDkzMzQ5YmJkMjIwZjA4NmY5NjM3OTFmODllNjA&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBudWtvX3lva29oYW1hJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz04OGI3ZmU2MTg0YWVhZTk2MzhlMTUzNjhmYzU1N2I5OQ&blend-x=120&blend-y=500&blend-mode=normal&s=8e9829c3d5a09270c7087cebc965e424)
PostgreSQLのロール - Qiita
はじめにみなさんこんにちは。NTTテクノクロス 原田です(いつもはぬこ@横浜名義でQiitaに書いてますが・・・)。これはNTTテクノクロス Advent Calendar 2018の4日目の記…
エラー②:no schema has been selected to create in
GRANT
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9UG9zdGdyZVNRTCVFMyU4MSVBRSVFNiVBOCVBOSVFOSU5OSU5MCVFMyU4MSVBOCVFNiVBOCVBOSVFOSU5OSU5MCVFOCVBOCVBRCVFNSVBRSU5QSVFMyU4MiVCMyVFMyU4MyU5RSVFMyU4MyVCMyVFMyU4MyU4OSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9YTY4OWYxNGFhZmNhZGQwMzFjYjBlYTNmNGQ0ZTRmYzc&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBra2s3NzcmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWRiNTA4ODdhNjcwYjg3NGZiMWVkNGY2ZDQzZTg0MzM3&blend-x=142&blend-y=486&blend-mode=normal&s=1ee14ceed2f0cbaa5843717090a911ed)
PostgreSQLの権限と権限設定コマンド - Qiita
【権限には大きく2つに分類される】DBユーザ単位の権限テーブル単位の権限(SQLコマンドのみ設定可)【権限を設定できるコマンドは大きく2種類ある】PostgreSQL標準のコマンド(接続後処…
![](https://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/055c9694a729bbe31be356b0bc0e55c2.png)
ロールにテーブルやビューなどに対する権限を追加する(GRANT)
GRANT コマンドを使ってロールに対して権限を追加することができます。権限はテーブルやスキーマの作成する権限や、テーブルやカラムからデータを取得したりデータを追加する権限などです。ここでは PostgreSQL で GANT コマンドを使って権限を追加する方法について解説します。
コメント