Published on

MySQLをPrismaで扱ったときのメモ

目次

レンタルサーバーで laravel を動かして、API として使っていた状態から データベースだけを移行して使おうとしたときのメモ。

Prisma インストール

Prismaは js でデータベースといい感じに連携して使えるライブラリ。

  • laravel では api にパラメータを付与してデータを取得する
  • prisma ではデータベースと連携させると自動で prisma 用に準備をくれるのでファイル内に取得したい内容を記述して取得する

今回は既存アプリに追加するケースになります。

セットアップ

npm install prisma --save-dev
npx prisma
npx prisma init

初期化、諸々ファイルが作成される。

.env
DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"

mysql への接続情報をそれぞれいれる。 USER はユーザー名、PASSWORD はパスワード、HOST は IP。 注意点としてそもそも外部からデータベースサーバへのアクセスを許可していないサーバーもあって、その場合は接続がおそらくできないんすよね。 クラウドや VPS サーバーなどを使っている人だったら外部からアクセスできる設定にできるはず。

schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
  //エラーでたら直に url ="mysql://USER:PASSWORD@HOST:PORT/DATABASE"
}

これで接続準備 OK。

prisma generate

generate じゃなく migration のコマンドもあったのですが違いは今回確認してません。

すると以下のように prisma 用に変換されたものが表示される

schema.prisma
model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
}

実際にデータのやりとり

Nextjs の場合。

import { PrismaClient } from '@prisma/client'

export async function getStaticProps() {
  const prisma = new PrismaClient()
  const posts = await prisma.post.findMany()

  return {
    props: { posts },
  }
}

このように色々ごにょごにょしなくても結構さくっと使うことができることがわかりました。

また、自分の場合データ取得時に Date 型についてエラーがでたのですが、 superjsonなるものを入れて解決。

既存の MySQL から planetscale や CockroachDB も試したんですが、インポートエラーがでたり、import はカード登録必要だったりで、今回のは完全無料でやりたく課金の心配が嫌だったので やめました。新規で使うにはいい選択肢になりますね。