

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に書き換えてやる必要があります。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。