PlanetScale 終了後、Supabase / Neon への移行ガイド
公開: / 著者: StackComp 編集部
2024年に PlanetScale が Hobby プラン(無料枠)を廃止し、 現在は実質エンタープライズ向けのみのサービスとなりました。 個人開発で PlanetScale を使っていたユーザーの多くが、Supabase または Neon に移行しています。 本記事では移行先の選び方と、MySQL → PostgreSQL 移行の手順を整理します。
移行先の選択(まずここ)
PlanetScale は MySQL ベースですが、代替として人気の Supabase・Neon は両方とも PostgreSQL ベースです。 つまりMySQL → PostgreSQL のスキーマ移行が必要になります。
- Auth/Storage も統合したい → Supabase
- 純粋な Postgres を低レイテンシ運用 → Neon
- MySQL のままがいい → AWS RDS for MySQL、Aiven for MySQL、Tidb Cloud(個人プランあり)
MySQL → PostgreSQL の主な互換性問題
実際に PlanetScale → Supabase/Neon 移行で躓くポイントは大きく4つ。
1. 自動採番カラム
- MySQL:
AUTO_INCREMENT - PostgreSQL:
SERIALまたはGENERATED ALWAYS AS IDENTITY
2. データ型の違い
- MySQL
TINYINT(1)→ PostgreSQLBOOLEAN - MySQL
DATETIME→ PostgreSQLTIMESTAMP WITHOUT TIME ZONE - MySQL
TEXTサブタイプ(TINYTEXT/LONGTEXT 等) → PostgreSQL はTEXTのみ - MySQL の
JSON→ PostgreSQL のJSONB推奨(検索性能が高い)
3. クエリ構文の違い
- バッククォート(
`)→ ダブルクォート(") LIMIT後のOFFSET句の順序(同じだが、PostgreSQL はFETCH FIRST n ROWSも使える)- 大文字小文字: PostgreSQL は識別子をデフォルトで小文字化、引用符付きの場合のみ大文字小文字を区別
GROUP_CONCAT()→STRING_AGG()
4. ON DUPLICATE KEY UPDATE
- MySQL:
INSERT ... ON DUPLICATE KEY UPDATE - PostgreSQL:
INSERT ... ON CONFLICT (key) DO UPDATE SET
移行手順(Neon 移行を例に)
0. 事前準備
- PlanetScale のスキーマと最新の
mysqldumpをローカルに保存 - 移行前後の動作確認用テストを準備
- 本番切替前に staging で検証する期間を取る
1. スキーマ変換
MySQL の CREATE TABLE 文を PostgreSQL 形式に変換します。
手動変換 + pgloader(オープンソースの自動変換ツール)併用が定石。
brew install pgloader # macOS
pgloader mysql://user:pass@old-host/db postgres://user:pass@neon-host/db pgloader はスキーマ + データを一括変換してくれますが、複雑なインデックス・ストアドプロシージャは手動で確認・修正が必要。
2. アプリのクエリ書き換え
Prisma / Drizzle / TypeORM 等の ORM を使っているなら、設定の provider を切替えれば
大半は自動で対応されます。生 SQL を書いている部分は前述の互換性問題を1つずつ修正。
3. 接続文字列の差し替え
Neon のダッシュボードで取得する Postgres 接続文字列(postgresql://user:pass@ep-xxx.neon.tech/db)を
アプリの環境変数に設定します。SSL 必須なのでクエリパラメータに ?sslmode=require を忘れずに。
4. データ整合性のテスト
- 行数の一致確認(
SELECT COUNT(*) FROM each_tableを旧・新両方で) - 主要クエリの動作確認(LIMIT/JOIN/集約)
- NULL の扱い、空文字 vs NULL の差を要確認
5. 本番切替
- メンテナンス時間を確保(数十分〜数時間)
- PlanetScale を読み取り専用にして最終 dump
- Neon に最終 dump を投入
- 環境変数を切替えてデプロイ
- 動作確認 → PlanetScale 側を停止
料金比較(PlanetScale 旧 Hobby vs 移行先)
| サービス | 無料/最安 | 備考 |
|---|---|---|
| PlanetScale 旧 Hobby | 無料(5GB) | 2024年に廃止 |
| Supabase 無料 | 無料(500MB) | 1週間放置でPause |
| Supabase Pro | $25/月(8GB込み) | Auth/Storage/Realtime込み |
| Neon 無料 | 無料(500MB / コンピュート100h) | Pause なし |
| Neon Launch | $19/月(10GB込み) | 純粋なPostgres |
詳細な月額試算は マネージドDB月額シミュレーター で。
まとめ
PlanetScale 終了は寝耳に水でしたが、Supabase・Neon ともに本番運用に耐える品質なので、 移行先の選択を間違わなければ事業継続に大きな影響はありません。 移行コストは「スキーマ + クエリの書き換え」がほぼ全てで、データ自体の移送は pgloader で済みます。