本記事の概要
この記事では、MySQLをクラウドで立ち上げ、速攻で利用を開始できるIPaaSサービス、PlanetScaleについて Next.jsで利用する具体例を交えながら、利用準備が整うまでを順を追って解説します。
ぜひ最後までご覧ください。
先日本ブログにてご紹介したSupabaseはPostgreSQLで裏側のDBが構築されるサービスで コンセプトは似ています。よろしければこちらもご覧ください。
参考記事: Next.js製ブログにアクセスカウンターを追加する作業でSupabase使ってみた。
注意点
PlanetScaleはforeign key制約(外部キー制約)をサポートしていない ので、既存DBからの移行ができない可能性がありますので 検討にあたりこの点を確認されることをお勧めします。
また、多額の資金調達をしているものの、未だ正式リリース版となっていないことにも商用利用にあたり、注意が必要かと思われます。
参考記事:PlanetScaleとは何か、なぜ外部キー制約をサポートしていないのか 参考記事:PlanetScale is now generally available
※ 2023/10/21追記
作業
まず、PlanetScale のトップページにアクセス。
右上の、「Sign in」 を選択します。
メールアドレスでの登録もできますが、私は手軽さを重視して 「Github」 でのログインを選択。
サービスを初めて使うので、引き継ぐべきDBもないですから 「Start With Empty Database」 を選択。
GithubみたいなUIですが、必要な情報を入力していきます。
今回はお試しということでプランから「Hobby」を選択。おそらくユーザーの身元確認と与信も兼ねて、クレジットカード情報の入力は避けられないようです。
このあたりは、Jiraなどの、Atlassian社の運営するサービスと使い勝手が似てますね。いつのまにか無料枠を超えて、課金が生じる可能性もある ので既にトラフィックがあるサービスでご利用の方はお気をつけいただければと思います。
下にスクロールで進んで 「Create database」 を選択。
次の画面で 「どの言語経由で接続するか?」 という選択肢が大量に出てきます。私は、Next.js に加え、データベースのスキーマ管理にPrismaを使うので、これを選択。
すると、接続完了するまでのチュートリアルがそのまま表示されます!これは楽ちんですね笑
上記のように、画面の中程に表示されている中程に表示されている.env
の中身を丸ごと、Next.jsプロジェクトのルートディレクトリ直下に.env
をファイル作成した上でペーストします。
これで、接続設定は完了です。(かんたん!)Vercelで本番運用するときなどは.envをgitにコミットせず、環境変数を使って移しましょう。
参考記事: Vercelで環境変数を設定する
Next.jsアプリケーションでの接続設定
私の方では、Next.jsプロジェクトのエントリーポイントとなるpage/index.tsx
は以下のようになりました。
import { GetServerSideProps } from 'next';
import Image from 'next/image'
const { PrismaClient } = require('@prisma/client')
const Page = ({ user }: { user: any }) => {
return (
<main className="flex min-h-screen flex-col items-center justify-between p-24">
ユーザー情報がここにJSON形式で表示されます: {user}
</main>
)
}
export default Page
type Props = {
user: any // Typescriptの型判定を行うときは別途typeのライブラリが必要だが今回は省略
}
export const getServerSideProps: GetServerSideProps<Props> = async (context) => {
const prisma = new PrismaClient()
async function getUser() {
try {
const user = await prisma.user.findMany();
return user;
} catch (e) {
console.error(e);
await prisma.$disconnect();
throw e;
}
}
try {
const user = await getUser();
return {
props: {
user: JSON.stringify(user)
},
};
} catch (e) {
console.error(e);
return {
props: {
user: JSON.stringify([]), // DBに接続しないときは空配列を返します
},
};
}
}
あらかじめ、schema/prisma.schema.ts
を作成。
に以下のテスト用User
テーブルの定義を投げ込んでおき、プロジェクトルートでpushしてテーブルを作成しておきます。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma"
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
コマンドコンソール から以下のコマンドを実行。.env
により、接続設定が正しく行えていれば
データベースにUserテーブルが作成されるはずです。
prisma db push
ダッシュボード => プロジェクトを選択すると、ページ下部にログが出ており、テーブル作成のSQL文もログに出ているはず。
ローカルからMySQL DBへの接続は、Tableplusをあらかじめ設定しておきましょう。
先ほど設定した.envを
DATABASE_URL='mysql://[User]:[Password]@aws.connect.psdb.cloud/[Database]?sslaccept=strict'
このように設定して接続します。
あらかじめUserテーブルにテストデータを書き込んでおきます。
yarn run dev
でNext.jsのローカルサーバを立ち上げ、http://localhost:3000/
にアクセス。
ちゃんと表示されました!
まとめ
個人的にはPHP関連の開発をたくさんしていた&Wordpressなどでは大量にMySQL製のDBがある ということで、PostgresよりはMySQLの方が親しんでいて、触れやすいDBでした。
日本にはMySQLを使っているサービスがたくさんある
2021年のポストなのでちょっと古いですが、日本ではMySQLのシェアがとても多いです。
参考記事: インフォグラフィック:2021年開発者エコシステムの現状
それゆえ、 レガシー(過去の遺産)のデータベースをそのまま使用できるPlanetScaleはこれからいろいろ使い道がありそうだな と 思った次第でした。今度はダンプデータインポートの方法でも試してみたいと思います。
この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!