【Python】Supabase & SQLAlchemyにおけるIPv6対応方法

SupabaseがIPv6のサポートを開始したことにより、IPv4での接続文字列による操作ができなくなりました。今回の記事では、その対応方法を簡潔に説明していきます。

2024年03月06日

いままでフロントエンド系の記事ばかりでしたが、実はサーバーサイドもそれなりに齧っております。

個人開発において、データベースの利用料金は極力抑えておきたいものです。
そんな中、SupabaseならRDBを無料で使える。所詮は個人開発です。バックアップの必要もありません。
※ 利用を検討している方は、無料利用枠の制限を確認しておきましょう。

前提

以下の前提条件で進めていきます。
Supabaseのクライアントライブラリだけで済ませている人は無関係なので、そっと閉じましょう!

  • Supabaseのデータベースを接続文字列で利用したい人
  • SQLAlchemy1.4系

IPv4 から IPv6へ

早速本題です。大したことではないのですが、SupabaseのDBをORMで扱おうと思ったら、当然のことながら Connection Strings (接続文字列)というものを引っ張り出してこないといけません。

  • IPv4の場合: postgresql://postgres:[YOUR-PASSWORD]@db.[REF-ID].supabase.co:5432/postgres

  • IPv6の場合: postgresql://postgres.[REF-ID]:[YOUR-PASSWORD]@aws-0-[REGION].pooler.supabase.com:5432/postgres

このように変えてあげればいいわけです。

ダッシュボードに惑わされない心

ダッシュボードには注意書きとヒントが含まれています。

Specify when a connection can be returned to the pool. Please refer to our documentation to find out the most suitable mode for your use case.
If you’re using prepared statements in your database, you will need to either use the Session pool mode or use port 5432 in the connection string.

今回はORMでDB操作するので、5432のまま設定していきます。
加えて、SQLAlchemy 1.4以降では postgresql:// 形式が推奨されているようです。
ダッシュボードに書かれている形式(postgres://)では動かないので要注意
!!

※ 現在、注意書きは存在しないようです

なぜClientライブラリを使わないのか

Supabaseでは、DBの操作にClientライブラリが提供されています。
プロジェクトが完全にSupabaseに依存している場合、わざわざORMにする必要はないかもしれません。

認証を使わず、DBだけ利用したい。となると、かなりセキュリティルールを考えなければなりません。
※ そもそも実例を見たことがない

接続文字列でのアクセスであれば、REST API経由でのアクセスを全て拒否してDBの操作が可能かなと。ただそれだけです。

おわり

タイトルに大きくPythonと書いてしまいましたが、ぶっちゃけあまり関係ないです。
自身Flaskを使用しており、接続形式の問題でちょいハマったので。

そのうち、Flaskのハンズオンなんかも書けたらいいなとおもいます。

筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。