Skip to content

Neon(サーバーレス PostgreSQL)と接続する

Neon はサーバーレスの PostgreSQL。 FastAPI Cloud のダッシュボードからつなぐと、接続情報を環境変数としてアプリに自動で渡してくれる。
cf. Neon Integration - FastAPI Cloud


FastAPI Cloud ダッシュボードから Neon に接続する

Neon アカウントで認証する

アプリ詳細の Integrations タブを開いて、 Connect Integration を押す。

FastAPI Cloud のアプリ詳細の Integrations タブ。まだ連携がなく Connect Integration ボタンがある

Add Integration のダイアログが開くので、 Neon を選ぶ。

FastAPI Cloud の Add Integration ダイアログ。Database の Neon を含むプロバイダが並ぶ

Neon 側の認可画面がブラウザで開く。 FastAPI Cloud に渡す権限(Read projects / Read organizations)を確認して Authorize を押すと、 FastAPI Cloud に戻ってくる。

Neon の認可画面 Authorize FastAPI Cloud。Read projects と Read organizations を確認して Authorize する

アプリと Neon を接続する

アカウントをつないだら、アプリで使うデータベースを選ぶ。 FastAPI Cloud に戻ると Add Integration の Neon に Connected が付いてるので、あらためて Neon を選ぶ。

FastAPI Cloud の Add Integration ダイアログ。Neon に Connected バッジが付いている

Connect to Neon のダイアログが開くので、 project → branch → database の順に選んでいく。

Connect to Neon の 1 Project。Neon のプロジェクトを選ぶ

Connect to Neon の 2 Branch。production ブランチを選ぶ

Connect to Neon の 3 Database。neondb データベースを選ぶ

最後に Configure Neon で、注入される環境変数名を確認する。 Neon の接続文字列は DATABASE_URL っていう名前で渡される。 <user><password> みたいなプレースホルダは、接続時に選んだデータベースの実際の値で埋められる。 Connect Neon を押すと接続される。

Configure Neon。接続文字列が DATABASE_URL として渡されることを確認して Connect Neon する

Integrations タブに戻ると、つないだデータベースが Connected として並んでる。これで接続完了。

Integrations タブ。neondb が Connected として表示されている

コードから使う

連携すると、 FastAPI Cloud が PostgreSQL の接続文字列を DATABASE_URL 環境変数としてセットしてくれる。値は暗号化されたシークレットとして保存される。 Environment Variables 画面で見ると、値は伏字になってて、 Neon 連携由来なのを示す neondb バッジが付いてる。

アプリの Environment Variables 画面。DATABASE_URL が Neon 連携のシークレットとしてセットされ、neondb バッジが付いている

Note

DATABASE_URL をすでに別の用途で使ってるなら、連携のときに NEON_DATABASE_URL みたいな別名にもできる。

あとは データベース でやったように、接続文字列を環境変数から読んで SQLModel の engine を作るだけ。ローカルの SQLite から本番の PostgreSQL に変えても、コードはほぼそのまま。

db.py
import os

from sqlmodel import create_engine

# DATABASE_URL は連携時に環境変数として自動でセットされる
engine = create_engine(os.getenv("DATABASE_URL"))

os.getenv で直接渡してもいいし、 設定管理(pydantic-settings)Settings 経由で読んでもいい。

SQLite との違い

  • データベース で付けてた connect_args={"check_same_thread": False} は SQLite 特有の設定なので、 PostgreSQL ではいらない。
  • PostgreSQL に接続するドライバ(psycopg2-binary など)もインストールしておく(uv add psycopg2-binary)。

Neon の接続情報を環境変数で渡す

FastAPI Cloud ダッシュボードから Neon に接続する代わりに、 Neon で先にデータベースを作って、その接続情報を FastAPI Cloud の環境変数として登録しても繋がる。 設定管理(pydantic-settings) のように環境変数から読むようにしておく。

登録はダッシュボードの Environment Variables 画面でやるのが手軽。変数名は自分のアプリが読むものに合わせる。 POSTGRES_* から接続 URL を組み立てる作り(full-stack-fastapi-template 方式)なら、 POSTGRES_SERVER / POSTGRES_PORT / POSTGRES_DB / POSTGRES_USER / POSTGRES_PASSWORD を Neon の接続情報で埋める。

FastAPI Cloud のダッシュボードの Environment Variables 画面

  • パスワードみたいな秘密の値は Secret をオンにする。暗号化されてダッシュボードでは見えなくなる(実行時はアプリから読める)。
  • 入力したら Save and Redeploy で登録と再デプロイ(環境変数の変更は再デプロイで反映される)。
  • 数が多いときは Import .env でローカルの .env をまとめて取り込める。その .env 自体はパスワードを含むのでコミットしない(.gitignore に入れる)。

単一の DATABASE_URL で読む作りなら、 DATABASE_URL を 1 つ登録するだけでいい(Web UI 連携が自動でやってくれるのと同じ変数)。

CLI でも登録できる

ダッシュボードの代わりに fastapi cloud env set でも登録できる: cf. Env Command - FastAPI Cloud

例えばこんな感じ:

fastapi cloud env set POSTGRES_USER neondb_owner
fastapi cloud env set --secret POSTGRES_PASSWORD

--secret を付けると暗号化シークレットになる。値を省くと伏字でプロンプトされるので、パスワードを画面に出さずに登録できる。 CLI で変えても自動では再デプロイされないので、次の fastapi deploy で反映される。