【個人開発】無料DBを求めてPlanetScaleからNeonに移行したら快適だった話

こんにちは！[ぬこすけ](https://twitter.com/nuko_suke_dev)です！

個人開発をしていると「データベースはどこで立てようか...」というのは悩みの種です。
「無料でデータベース使いたい」「あんまりデータベースの構築に時間をかけたくない」などアレコレ考えてしまいます。

そんなあなたに、無料かつ楽にRDBを作れる「[PlanetScale](https://planetscale.com/)」をお勧めしたい！と言いたいところですが、 **なんと2024年4月8日に無料枠が廃止されてしまいます** 。

https://planetscale.com/blog/planetscale-forever

かくいう私も[技術書をランキング形式で紹介するサイト](https://nuko-programming.com/categories/Python/books/page/1)を昔作っていたのですが、データベースはPlanetScaleを使っていたため打撃をくらってしまいました...。

このような事態を受け、私のサイトではPlanetScaleの代替として **Neon** というサーバーレスなデータベースを提供しているサービスに乗り換えてみました。

https://neon.tech/

みなさんの参考になるように、PlanetScaleと比較しながら体験談を共有できればなーと思います。

## 想定読者

趣味やポートフォリオ構築などの個人開発でデータベース構築にあたって次のようなお考えの方

* 無料枠がある
* 開発者体験を高くしたい
* RDBを使いたい
* 脱PlanetScale！

## Neonとは

NeonはサーバーレスなPostgresデータベースを提供するDBaaS（Database as a Service）です。

もちろん、この記事で紹介するからには **無料枠** があります。

https://neon.tech/pricing

記事執筆時点（2024/3/14）では0.5GiB(512MB)のストレージ、0.25CPU、1GBのRAMがあります。
また、PlanetScaleのようなブランチ機能もありますが、１プロジェクト、10ブランチまでの制限のようです。

個人開発で使う分には十分なスペックかなーと思います。

## Neonに乗り換えて良かったこと

### ブランチ作るとデータごと親ブランチからコピーしてくれる！

**ほぼこれが一番デカい機能** だと思っています。

PlanetScaleと同じく、 **Neonにはブランチ機能** があります。

ブランチ機能はGitのようにブランチを作成して、例えば本番のデータベースとは別にデータベース環境を作成することができます。
この機能のおかげで、開発用のデータベースを作れるわけです。

![スクリーンショット 2024-03-14 8.45.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164159/3a9b516b-597c-4c15-a0a6-604190c0378e.png)
（[Neonの公式サイト](https://neon.tech/branching)より引用）

同じブランチ機能でもPlanetScaleと違うところは、 **Neonはデータごと親
ブランチからコピーしてくれる** ところです。
なので、**すぐに本番環境と同じデータを含んだ開発用データベース環境を構築できます**。

PlanetScaleにもデータごとコピーしてくれる機能はあるにはあるのですが、[有料の機能](https://planetscale.com/docs/concepts/data-branching)のようでした。

また、 **[いつでも本番のデータを開発用のブランチ(データベース)に同期することができます](https://neon.tech/docs/manage/branches#reset-a-branch-from-parent)** 。

開発を進めていく中で本番のデータと乖離が出てきても、Web上からボタンポチで開発用のデータベースも本番のデータに変更することができます。

### Web上からテーブル確認やクエリ実行できる！

**NeonではWeb上からデータベースやテーブルの確認、SQLの実行もできます** 。

ローカルでpgAdminやDataGripでデータベースと接続するでももちろん大丈夫ですが、シュッとテーブルを確認したい時やSQL実行したいときは便利です。

[私のサイト](https://nuko-programming.com/categories/Python/books/page/1)をPlanetScaleからNeonに移行するときもポチポチWeb上からSQL投げてました。

## PlanetScaleと比べた注意点

### ブランチのマージ機能はない

開発環境で作ったスキーマを本番環境のデータベースに適用したい場面はたくさんあるでしょう。

PlanetScaleはGitHubのようなPullRequestのような形で、スキーマの変更をメインのブランチに適用させることができました。

https://planetscale.com/docs/concepts/deploy-requests

**Neonの場合はスキーマの変更をPullRequestのような形でメインブランチにマージできるような機能ありません**。

https://community.neon.tech/t/how-to-merge-branches-together/438

なので、**Neonを使う場合は手動でマイグレーションを実行する必要**がありそうです。

### 東京リージョンがない

日本向けにWebサイトを作るなら、速度的な面でデータベースはできるだけ日本で立てたいでしょう。

PlanetScaleでは東京のリージョンに対応していました。

https://planetscale.com/docs/concepts/regions

一方で**Neonは日本のリージョンに対応していません**。
できるだけ日本に近いところでデータベースを立てるなら、記事の執筆時点では **シンガポール** になります。

https://neon.tech/docs/introduction/regions

### 同時接続数が少ない

PlanetScaleの同時接続数は1000なのですが、 [**Neonはデフォルトで100** ほどのよう](https://community.neon.tech/t/max-number-of-simultaneous-connections/159)です。
実際、 `SHOW max_connections;` を実行したところ `112` でした。

私のアプリケーションでもPlanetScale利用時は同時接続数でエラーが起こることはなかったのですが、Neonに切り替えてからエラーが出るようになりました。

Neonではデータベースの同時接続数を気にする必要がありそうです。

[2024/3/16追記]

**`-pooler` というエンドポイントを使うことで同時接続数の制限を最大10,000に増やせる** ようです。

https://neon.tech/docs/connect/connection-pooling#connection-pooling

設定は無料枠でも可能&楽にできました。
Pooled connection というチェックボックスを入れると `-pooler` 付きのエンドポイントが発行されました。

![スクリーンショット 2024-03-16 9.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164159/f88a8f13-271e-3e90-93d6-746821d1f019.png)

## まとめ

個人開発で無料のデータベースを求めるならNeon！終わり！

なお、PlanetScaleからの脱却にあたっての乗り換え先サービスの検討は次の記事が参考になりました！感謝！

https://qiita.com/Kenta_Kobayashi/items/ba445245ecd357dd19d7

また、私が今回Neonに移行した [Webサービス](https://nuko-programming.com/categories/Python/books/page/1) について、古い記事ですがバズった記事もあるのでぜひ！

https://qiita.com/nuko-suke/items/652366597ce2ce0a91f9