CommentOut

Nuxt.jsでPrismaを使ってMySQLを管理してみる Nuxt.jsでPrismaを使ってMySQLを管理してみる

Nuxt.jsでPrismaを使ってMySQLを管理してみる

公開日:  最終更新日:

Nuxt.jsには標準でデータベースを管理する機能はありません。
しかし、データベースを自己管理するにはなるべく避けたいです。
マイグレーションしたいんです。
そこでPrismaを使うことにしました。

なぜ、SQLを自己管理したくないか

複数人で開発する時、それぞれのローカルでDB定義を簡単に合わせることができるため

複数人で開発する時にGitを使うのは、もはや当たり前ですが、Gitにコミットするソースはローカルで動作確認ができたコードに限るべきです。(コミットしてからCI/CDでステージング環境にデプロイして動作テストするのはご法度)

ということは、それぞれの開発環境でテスト用にDBを持つことになりますが、それぞれがバラバラに開発を進めている状態で、DB定義共通化する必要があります。

そこでマイグレーションを活用することで、簡単にDB定義をそろえることが可能になります。

Nuxt.js環境でのPrismaの使い方

まず、npmコマンドを使って、プロジェクトにprismaをインストールして、初期化します。

$ npm install prisma @prisma/client
$ npx prisma init

次に、MySQLへの接続情報を”.env”に書き込みます。

# MySQLの場合
DATABASE_URL="mysql://user:pass@localhost:3306/database_name"
# PostgreSQLの場合
DATABASE_URL="postgresql://user:pass@localhost:5432/database_name"

そして、prisma/schema.prismaにテーブル定義を記載します。

// prismaクライアント設定
generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

// データソース(MySQL)
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

// モデル定義
model User {
  id        Int @id @default(autoincrement())
  email     String @unique
  name      String?
  create_at DateTime @default(now())
  update_at DateTime @default(now())
}

マイグレーションファイルを作成する

$ npx prisma migrate dev --name {migrate_name}

{migrate_name}には、このマイグレーションのバージョン名を入力します。

このコマンドを実行すると、マイグレーションSQLが作成されます。
{日時}_{migration_name}/migration.sqlというファイルが生成されます。

そして、マイグレーションを実行するには、以下のコマンドを実行します。

$ npx prisma generate

prismaのマイグレーションは差分型

prismaのschema定義ファイルはこのschema.prismaの1ファイルのみです。

そのため、schema.prismaから定義を消せば、削除(DROP TABLE)するマイグレーションSQLが生成されますし、データ型を変更すれば、変更(ALTER TABLE)するマイグレーションSQLが生成されます。

schema.prismaを変更したら、”npx prisma migrate dev”を実行することをお忘れなく!

prismaでカラム名を変更する時は要注意

prismaではschema定義ファイルは1つと説明しましたが、そうなると問題になるのが、カラム名を変更する時です。

“何”を”何”に変更という情報を持たないprismaでは、カラム名の変更は”旧カラムが削除され、新しいカラムが追加された”と判断されます。
つまり、”そのカラムに入っていたデータは消えてしまう”ということ。

開発時は問題にならないかもしれませんが、運用開始後にカラム名の変更を要する時に問題になる可能性が高いです。

この問題を回避するために、”npx prisma migrate dev”コマンドで生成したマイグレーションSQLを手直ししなくてはいけません。

試しに、M_Projectテーブルのカラム名をnameからproj_nameに変更してみます。

// モデル定義
model M_Project {
  id		Int			@id	@default(autoincrement())
  name		String?
  create_at	DateTime	@default(now())
  update_at	DateTime	@default(now())
}
// モデル定義
model M_Project {
  id		Int			@id	@default(autoincrement())
  proj_name	String?
  create_at	DateTime	@default(now())
  update_at	DateTime	@default(now())
}

マイグレーションSQLを生成します。

$ npx prisma migrate create --name change_column_name__m_project

コマンドが”npx prisma migrate dev“ではなく、”npx prisma migrate create“であることにご注意ください。
“npx prisma migrate dev”はマイグレーションSQLを作成し、そのままデータベースにSQLの内容を反映させるコマンドです。
“npx prisma migrate create”はマイグレーションSQLのファイル作成のみを行うコマンドです。

生成されたSQLの中身がこちら

-- AlterTable
ALTER TABLE `m_project` DROP COLUMN `name`,
    ADD COLUMN `proj_name` VARCHAR(191) NULL;

このように、カラム名を変更すると、DROP COLUMN→ADD COLUMNという処理になってしまうため、手作業でCHANGE COLUMNに書き換えてやる必要があります。

宣伝
WordPressサイトのテンプレート編集やトラブル対応、バグ修正、簡単なJavascriptの作成(カルーセルやバリデーション等)など、小規模なスポット対応を受け付けております。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。

この記事を書いた人

uilou

uilou

プログラマー

基本的に、自分自身の備忘録のつもりでブログを書いています。 自分と同じ所で詰まった人の助けになれば良いかなと思います。 システムのリファクタリングを得意としており、バックエンド、フロントエンド、アプリケーション、SQLなど幅広い知識と経験があります。 広いだけでなく、知識をもっと深堀りしていきたいですね。