FlaskでSQLAlchemyを使ってPostgreSQLの接続や使い方を解説する

スポンサーリンク

この記事では、Flask SQLAlchemy という ORM – Object Relational Mapper を使って、Flask アプリケーションと PostgreSQL データベースシステムを接続する方法を学びます。

スポンサーリンク

PostgreSQLとは?

PostgreSQLは、MySQLデータベース管理システムと同様に、データベーステーブルの形でデータにアクセスし、保存し、処理するために使用されるRDBMSの別のタイプです。

PostgreSQLは、SQL- Structured Query Languageを使用してデータベースにアクセスし、処理することができ、またPostgreSQLで様々なタスクを実行することができます

PostgreSQLの基本構造

Postgres DB の内部では、データはテーブルの形で保存されます。

典型的なPostgresのテーブルは次のようなものです。

| ID|名前|クラス|学年|など
| — | — | — | — |
| 1|アリア|IX|B|。

| 2|Snippy|X|A|。

| 3|レイ|VIII|D|||。

| 4|キム|VI|A|。

| 5|ジェニファー|XII|B|||。

| 6|ジニー|X|A|。

PostgreSQLのテーブル行はレコードと呼ばれ、列はフィールドと呼ばれます。

したがって、上記のテーブルでは、6つのレコードと4つのフィールドがあります。

MySQLとPostgreSQLの違い

MySQLとPostgreSQLはどちらもRDBMSに属しますが、両者にはいくつかの重要な違いがあります。

  • MySQLとPostgreSQLの基本的な違いの1つは、PostgreSQLがORDBMS(オブジェクトリレーショナルデータベース管理システム)であるのに対し、MySQLはコミュニティ主導のRDBMSであることです。
  • MySQLがJSONしかサポートできないのに対し、PostgreSQLはJSONやXMLなどの最新のアプリケーション機能をサポートできることもMySQLに対するPostgreSQLの利点です。

なぜ SQLAlchemy で PostgreSQL を Flask アプリケーションに接続するのか?

SQLAlchemy は Python で書かれた ORM-Objects Relational Mapper です。

SQLAlchemy は Python で書かれたオブジェクトリレーショナルマッパーで、 SQL 文を使わずにデータベースとやりとりするためのものです。

SQLAlchemy は SQL の上に追加レイヤーを提供し、データベースやテーブルを Python のクラスオブジェクトのように使うことを可能にします。

クラスオブジェクトを作るだけで、あとは SQLAlchemy がやってくれます。

Flask では、 Django Models という形で ORM があらかじめ用意されている Django と違って、 ORM はあらかじめ用意されていません。

したがって、この Web フレームワークでモデルを使うには、 Flask-SQLAlchemy ORM ライブラリをインストールする必要があります。

システムにPostgreSQLをセットアップする

このセクションでは、Flask- SQLAlchemy-Postgres プロジェクトで必要なパッケージをすべてダウンロードし、セットアップします。

1. PostgreSQLシェルのインストール

PostgreSQLをインストールするには、こちらのリンクにアクセスします。

PostgreSQLがインストールされたら、SQLシェルを開き、DB接続のユーザー名とパスワードを設定します。

以下のコマンドを実行し、ターミナルでシェルを開きます。

sudo su postgres pqsl

Windowsの場合は、検索メニューでSQLシェルを直接検索してください。

接続の詳細はデフォルトのままです(括弧内)。

  • サーバー:localhost
  • データベース:postgres
  • ポート: 5433
  • ユーザー名:postgres

パスワードを入力すると、デフォルトでPostgreSQLのDBにプロンプトが表示されます。

では、データを保存するためにFlaskという名前で新しいDBを作成しましょう。

CREATE DATABASE <db_name>;

ここでは SQL 構文のみを使用しています。

JournalDev のサイトにある SQL チュートリアルを見て、クエリ言語についての知識を得てください。

現在のDBをFlask DBに変更するには、次のコマンドを使用します。

c <db_name>;

これで、新しいFlask DBになりました。

pip install psycopg2-binary

2. アダプターツール psycopg2 のインストール


Python用のPostgreSQLデータベースアダプタであるpyscopg2も必要です。

pipコマンドを実行しましょう。

pip install flask-sqlalchemy

3. Flask 用 ORM パッケージのインストール


まず最初に Flask-SQLAlchemy ORM をインストールする必要があります。

パッケージのインストールは、以下のコードを実行するだけです。

pip install Flask-Migrate

また、Flask-Migrateもインストールする必要があります。

Flask-Migrate は Alembic という軽量なデータベースマイグレーションツールを使用します。

データベースやテーブルを作成・更新することができます

また、テーブルのフィールドを削除したり、新規に作成した場合、既存のテーブルを更新することができます

Flask-Migrateをインストールするには、以下のコマンドを実行します。

from flask_sqlalchemy import SQLAlchemy
 
db = SQLAlchemy()
 
class Model_name(db.Model):
    __tablename__ = 'table_name'
 
    field1_name = db.Column(db.Field1Type, primary_key...)
    field2_name = db.Column(db.Field2Type)
    field3_name = db.Column(db.Field3Type)
 
    def __init__(self, Field1_name,Field1_name,Field1_name):
        self.field1_name = field1_name
        self.field2_name = field2_name
        self.field3_name = field3_name
 
    def __repr__(self):
        return f"<statement>"

これで完了です。

SQLAlchemy を使って Flask で PostgreSQL データベース接続を実装する

ここでは、Databaseにユーザ情報を格納する簡単なFlaskアプリケーションを作成します。

1. Flask モデルの作成

モデルとは、データベース内のテーブルを表す Python のクラスです。

テーブルの構造に関する情報を含んでいます。

Flaskでは、すべてのDB情報とモデルを、メインアプリケーションのファイルのすぐ横にあるmodels.pyという別のファイルに保存するのがよりシステマチックな方法です。

典型的なmodels.pyファイルは以下のようなものです。

from flask_sqlalchemy import SQLAlchemy
 
db = SQLAlchemy()
 
class InfoModel(db.Model):
    __tablename__ = 'info_table'
 
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String())
    age = db.Column(db.Integer())
 
    def __init__(self, name,age):
        self.name = name
        self.age = age
 
    def __repr__(self):
        return f"{self.name}:{self.age}"

これは、古典的なPythonのクラスと同じようなものです。

これらは、テーブルのフィールドとその表現を示しています。

そこで、ユーザー情報を格納するための小さなInfoModelテーブルを作成してみましょう。

models.py。

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from models import db, InfoModel
 
app = Flask(__name__)
 
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://<username>:<password>@<server>:5432/<db_name>"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 
db.init_app(app)
migrate = Migrate(app, db)
 
#general Flask Code
@app.route('')
# Your code
 
if __name__ == '__main__':
    app.run(debug=True)

2. Flask アプリケーションの作成

では、FlaskアプリケーションとPostgresを接続します。

構文は以下の通りです。

from flask import Flask,render_template,request
from flask_migrate import Migrate
from models import db, InfoModel
 
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:1148@localhost:5432/flask"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
migrate = Migrate(app, db)
 
@app.route('/form')
def form():
    return render_template('form.html')
 
 
@app.route('/login', methods = ['POST', 'GET'])
def login():
    if request.method == 'GET':
        return "Login via the login Form"
     
    if request.method == 'POST':
        name = request.form['name']
        age = request.form['age']
        new_user = InfoModel(name=name, age=age)
        db.session.add(new_user)
        db.session.commit()
        return f"Done!!"
 
 
if __name__ == '__main__':
    app.run(debug=True)

ここで

  • Flask オブジェクト – app を作成します。
  • そして、PostgreSQLの接続を設定します。
  • シンプルにするために、SQL_TRACK_MODIFICATIONSをFalseにしています。
  • それから、SQLAlchemyオブジェクトのdbにappオブジェクトを渡す。
  • 移行用の Migrate オブジェクトを作成します。

以上です。

また、app.py ファイルに以下の Views を追加してください。

apps.pyに以下のViewsを追加します。

python db init
python db migrate
python db upgrade

クラスオブジェクトと同じように、テーブルを操作することができます

以下のようにします。

  • 新しいデータを追加するには、db.session.add() を使用します。
  • db.session.comit() で変更内容を保存します。

3. Flaskのコードを実装する

最後に残っているのは、migrationsを実行することです。

というわけで、コマンドを実行します。

python app.py

これで完了です。

次に、サーバーを実行します。

SELECT * FROM info_table

そして、ブラウザをチェックしてみましょう。

“/form “にアクセスします。

Postgres
Postgres

送信をクリック

Form
Form

これで、PostgreSQLのシェルで、タイプすることができました。

Success
Success

と入力すると、データが表示されます。

PostgreSQL
PostgreSQL

完璧です。

まとめ

以上、皆さんお疲れ様でした! 以上、FlaskのPostgreSQLとSQLAlchemyの接続設定についてでした。

タイトルとURLをコピーしました