Okarin note

頭の整理もかねて色々と書いていきます

最近流行りのprismaを使ってみた。環境構築編

TypeScript で使える OR マッパー。
別の OR マッパーだと TypeORM がある。

今のプロジェクトでTypeORMは使っているがどう違いがあるのか気になったのでやってみる。

www.prisma.io

prisma のインストール

npm i prisma

初期化する

npx prisma init

このコマンドで prisma を使うための準備ができる。

ルートのファルダに prisma 用のフォルダと.env ファイルが作成される

prisma/migrations/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

.env

# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB (Preview).
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="mysql://username:password@localhost:3306/mydb"

.env の環境設定ファイルから接続情報を読み込むようになっているので修正する。

テーブル情報を追加する

こんな感じで追加してみた。

prisma/migrations/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model Post {
  id        Int      @id @default(autoincrement())
  content   String
  postedBy  String
  trackingCookie String
  createdAt DateTime @default(now())
}
  • @id
    • 主キーの設定
  • @default()
    • デフォルトでどうするかの設定ができる auto_increment やら初期値やら設定ができる

テーブル定義を使ってテーブルを作成する

以下のコマンドを実行する

npx prisma migrate dev --name init
mysql> show tables;
+-----------------------------+
| Tables_in_bulletin-board-db |
+-----------------------------+
| Post                        |
| _prisma_migrations          |
+-----------------------------+
2 rows in set (0.00 sec)

出来ている!
簡単にできるから便利ね。

もっと色々使っていこう。

テーブル作成時に出るエラー

Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "bulletin-board-db" at "172.22.0.2:3306"

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: Error code: P1010

User `okarin` was denied access on the database `bulletin-board-db`

こんな感じのエラーが出た。
権限エラーのようだがよくわからなかったので shadow database のドキュメントを見に行った。

www.prisma.io

MySQL だと以下の権限が必要らしい

Database user must have CREATE, ALTER, DROP, REFERENCES ON *.* privileges

というわけで実行してみた。

GRANT CREATE, ALTER, DROP, REFERENCES ON `bulletin-board-db`.* TO okarin@%;

変わらない。。。いったいなぜなんだ。。。 しゃあなしでユーザーを root に変えたら動いた。

DATABASE_URL="mysql://root:password@localhost:3306/mydb"

動くだけならいいけど気になる。 自分でも調べますが、分かる方がいたら教えてください。。。