python SQLAlchemyを使ってPostgreSQL操作

Python

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

これでコードに直接接続情報などを記載することなく実行できます

他にも環境変数を利用することもできます
そのあたりはデプロイ先によっても変わるので、デプロイするときに解説したいと思います

コメント