PostgreSQLを使えるようになったら、pythonのSQLAlchemyを使ってデータベースを操作してみようと思います
これができればRenderでFlaskのWEBアプリケーションをデプロイすることができます
・環境
Windows 11
psql (PostgreSQL) 17.2
Flask 3.1.0
Flask-SQLAlchemy 3.1.1
psycopg2 2.9.10
python-dotenv 1.0.1
SQLAlchemy 2.0.37
・ベースとなるコード
以前の記事で紹介したFlaskを使ったWEBアプリケーションのコードを修正して、使用するデータベースをSQLiteからPostgreSQLに変更します
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
with app.app_context():
from . import models, views # viewsをインポート
views.init_views(app) # ルートを登録
db.create_all() # テーブルを作成
return app
・追加するライブラリのインストール
以前の記事から追加するライブラリのインストールします
pip install psycopg2 python-dotenv
- psycopg2はPostgreSQLのデータベースと接続するときに使用
- python-dotenvは接続情報を別ファイルから参照したいときに使用
・データベース接続先を変更
以下のようにコードを変更してデータベースの接続先をPostgreSQLに変更します
ログインするデータベースを事前に作っておきます
データベースの作り方は以前の記事を参考にしてください
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
# sqlite接続設定 ここを変更
#app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
#app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# PostgreSQL接続設定
app.config['SQLALCHEMY_DATABASE_URI'] = postgresql+psycopg2://ユーザー名:パスワード@localhost:5432/データベース名
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
with app.app_context():
from . import models, views # viewsをインポート
views.init_views(app) # ルートを登録
db.create_all() # テーブルを作成
return app
・PostgreSQLの接続設定のセキュリティ対策
特に本番環境では、環境変数や秘密管理システムを使用してデータベース接続情報を管理したほうがよさそうです
まず、参考までに.envファイルを使って変数を読み込む方法を解説します
以前の記事でも紹介していますので参考にしてください
まず、以下のような .envファイルを作成します
DATABASE_URL=postgresql+psycopg2://ユーザー名:パスワード@localhost:5432/データベース名
__init__.py でこの.envファイルを読み込みます
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from dotenv import load_dotenv
import os
db = SQLAlchemy()
def create_app():
# 環境変数を読み込む
load_dotenv()
app = Flask(__name__)
# PostgreSQL接続設定
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
with app.app_context():
from . import models, views # viewsをインポート
views.init_views(app) # ルートを登録
db.create_all() # テーブルを作成
return app
これでコードに直接接続情報などを記載することなく実行できます
他にも環境変数を利用することもできます
そのあたりはデプロイ先によっても変わるので、デプロイするときに解説したいと思います
コメント