今日やったFlaskのこと - PostgreSQL接続と環境変数の基本
こんばんは、トシぼうです。
今日は Flask で PostgreSQL データベースに接続する設定 をやっていました。
自分のメモも兼ねて、
- そもそもこの設定は「何をしているのか」
- なぜ環境変数を使った方がいいのか
- 初心者がやりがちな危ない書き方
を、できるだけ初心者目線でまとめておきます。
---
1. まずは素朴な接続設定から
DB_INFO = {
'user': 'postgres',
'password': '',
'host': 'localhost',
'name': 'postgres'
}
SQLALCHEMY_DATABASE_URI = f'postgresql+psycopg://{DB_INFO["user"]}:{DB_INFO["password"]}@{DB_INFO["host"]}/{DB_INFO["name"]}'一行で書くと「PostgreSQL に接続するための URL(接続文字列)を組み立てているコード」です。
- `user`:データベースにログインするユーザー名
- `password`:そのパスワード
- `host`:データベースサーバーの場所(ローカルなら `localhost`)
- `name`:接続したいデータベース名
これらを 1 本の文字列にまとめたものが SQLALCHEMY_DATABASE_URI で、
Flask + SQLAlchemy ではこれを設定しておくと、自動的にその DB に接続してくれます。
# ざっくりイメージ
人間でいうと、
> 「どの建物(host)の、何階(name)の、どの部屋(user)に、どの鍵(password)で入るか」
を 1 本のメモにまとめておく感じです。
---
2. ハードコードの危険さ(やりがちポイント)
上のコードは、学習用としては分かりやすい 反面、そのまま本番環境に使うと危険です。
理由はシンプルで、
> パスワードなどの「秘密情報」が、コードにそのまま書かれている
からです。
- GitHub にあげてしまうと、世界中にパスワードを公開しているのと同じになる
- うっかりスクショを貼ったり、ブログに載せたりしがち
- パスワードを変えたくなったときに、コードの中身も書き換えないといけない
なので、本番で使うときは必ず「環境変数」に逃がすのが基本ルールになります。
---
3. 環境変数を使った安全な書き方
Flask で環境変数を読むには、os モジュールを使うのが定番です。
import os
DB_INFO = {
"user": os.getenv("DB_USER", "postgres"),
"password": os.getenv("DB_PASSWORD", ""),
"host": os.getenv("DB_HOST", "localhost"),
"name": os.getenv("DB_NAME", "postgres"),
}
SQLALCHEMY_DATABASE_URI = (
f'postgresql+psycopg://{DB_INFO["user"]}:{DB_INFO["password"]}'
f'@{DB_INFO["host"]}/{DB_INFO["name"]}'
)ポイントはこの 2 つです。
- `os.getenv("DB_USER", "postgres")` のように、**環境変数がなかったらデフォルト値を使う**ようにしておく
- 実際のパスワードは `.env` やサーバーの設定画面にだけ書き、**コードには書かない**
# .env ファイルのイメージ
ローカル開発なら、プロジェクト直下に .env を置いて、こんな感じで書きます。
DB_USER=postgres
DB_PASSWORD=super-secret-password
DB_HOST=localhost
DB_NAME=postgresGit 管理するときは .gitignore に .env を入れておくのもお約束です。
---
4. 接続エラーが出たときのチェックリスト
初心者の自分がよくハマるポイントを、チェックリストにしておきます。
1. ユーザー名・パスワードは合っているか
- psql コマンドや GUI ツール(pgAdmin など)でログインできるか試す
2. ホスト名・ポートは正しいか
- Docker を使っているなら db など、コンテナ名になっている場合も多い
3. データベースが起動しているか
- Docker なら docker ps でコンテナが動いているか確認
4. URI のスペルミスをしていないか
- postgresql+psycopg:// の綴りミスで地味にハマりがち
「コードは合っているのに繋がらない」ときは、大体このあたりでミスっています…。
---
5. 今日の学びまとめ
- Flask + SQLAlchemy では、**接続文字列(URI)** に DB の情報をまとめて設定する
- パスワードなどの秘密情報を **コードに直書きするのは NG**。環境変数に逃がすのが基本
- `.env` + `os.getenv` の組み合わせを覚えておくと、他のフレームワークでも応用できる
- 接続エラーが出たら、「ユーザー/パス」「ホスト名」「DB 起動有無」「URI のスペル」を順番に疑う
自分と同じように Flask + PostgreSQL の接続でつまずいている人のヒントになれば嬉しいです。
次回は、実際にモデルを定義してデータを読み書きするところまで進めてみようと思います。
