Flask-SQLAlchemy + PostgreSQLでWebサービスを作成する
はじめに
サンプルアプリ(Feedback)を用いてご紹介します。
Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。
目的
この記事を最後まで読むと、次のことができるようになります。
No. | 概要 | キーワード |
---|---|---|
1 | Flask-SQLAlchemyの開発 | Flask-SQLAlchemy, psycopg2 |
2 | PostgreSQLの設定 | psql, Flask-Migrate |
実行環境
環境 | Ver. |
---|---|
macOS Catalina | 10.15.2 |
Python | 3.7.3 |
Flask-Migrate | 2.5.2 |
Flask-SQLAlchemy | 2.4.1 |
Flask | 1.1.1 |
psycopg2 | 2.8.4 |
requests | 2.22.0 |
ソースコード
実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。
関連する記事
0. 開発環境の構成
/
├── app
│ ├── __init__.py
│ ├── config.py
│ ├── feedback
│ │ ├── __init__.py
│ │ ├── common/
│ │ ├── models
│ │ │ ├── __init__.py
│ │ │ └── feedback.py
│ │ ├── static/
│ │ ├── templates/
│ │ └── views/
│ ├── run.py
│ └── tests/
└── instance
├── postgresql.py
├── sqlite3.py
└── config.py
1. Flask-SQLAlchemyの開発
パッケージのインストール
-
パッケージをインストールする。
procedure.sh~$ pip install Flask-Migrate ~$ pip install Flask-SQLAlchemy ~$ pip install Flask ~$ pip install psycopg2
-
psycopg2
のインストールでエラーが出る場合は、環境変数を指定してコマンドを実行する(macOS + venv環境)。procedure.sh~$ xcode-select --install ~$ env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2
SQLAlchemyの設定
-
開発環境のコンフィグを設定する。
config.py"""instance/config.py """ from instance.postgresql import SQLALCHEMY_DATABASE_URI as DATABASE_URI DEBUG = True # SECRET_KEY is generated by os.urandom(24). SECRET_KEY = '\xf7\xf4\x9bb\xd7\xa8\xdb\xee\x9f\xe3\x98SR\xda\xb0@\xb7\x12\xa4uB\xda\xa3\x1b' STRIPE_API_KEY = '' SQLALCHEMY_DATABASE_URI = DATABASE_URI SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_ECHO = True
-
PostgreSQLを設定する。
postgresql.py"""instance/postgresql.py """ SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://{user}:{password}@{host}/{name}'.format(**{ 'user': 'nsuhara', 'password': 'nsuhara', 'host': '127.0.0.1', 'name': 'db.postgresql' })
-
SQLite3を設定する(おまけ)。
sqlite3.py"""instance/sqlite3.py """ import os SQLALCHEMY_DATABASE_URI = 'sqlite:///{host}/{name}'.format(**{ 'host': os.path.dirname(os.path.abspath(__file__)), 'name': 'db.sqlite3' })
Modelの作成
-
SQLAlchemyのインスタンスを生成する。
__init__.py"""app/feedback/models/__init__.py """ from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def init(): """init """ db.create_all()
-
SQLAlchemyのクラス(
db.Model
)を継承してModelを作成する。feedback.py"""app/feedback/models/feedback.py """ from datetime import datetime from feedback.models import db class Feedback(db.Model): """Feedback """ __tablename__ = 'feedback' id = db.Column(db.Integer, primary_key=True, autoincrement=True) service = db.Column(db.String(255), nullable=False) title = db.Column(db.String(255), nullable=False) detail = db.Column(db.String(255), nullable=False) created_date = db.Column( db.DateTime, nullable=False, default=datetime.utcnow) def __init__(self, service, title, detail): self.service = service self.title = title self.detail = detail def to_dict(self): """to_dict """ return { 'id': self.id, 'service': self.service, 'title': self.title, 'detail': self.detail, 'created_date': self.created_date }
2. PostgreSQLの設定
Homebrew
の実行例となります。
サービスの確認
-
サービスを確認する。
procedure.sh~$ brew services list
result.shName Status User Plist postgresql started nsuhara /Users/nsuhara/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
サービスの開始/終了
-
サービスを開始する。
procedure.sh~$ brew services start postgresql
-
サービスを終了する。
procedure.sh~$ brew services stop postgresql
データベースの確認
-
データベースを確認する。
デフォルトで3つのデータベースが作成される。また、Macのユーザ名がOwnerとして設定される。
procedure.sh~$ psql -l
result.shList of databases Name | Owner | Encoding | Collate | Ctype | Access privileges --------------+---------+----------+---------+-------+--------------------- postgres | nsuhara | UTF8 | C | C | template0 | nsuhara | UTF8 | C | C | =c/nsuhara + | | | | | nsuhara=CTc/nsuhara template1 | nsuhara | UTF8 | C | C | =c/nsuhara + | | | | | nsuhara=CTc/nsuhara
データベースの接続/切断
-
データベースに接続する。
procedure.sh~$ psql -h "<host_name>" -p <port_number> -U "<role_name>" -d "<database_name>"
example.sh~$ psql -h "127.0.0.1" -p 5432 -U "nsuhara" -d "postgres"
-
データベースの接続を切断する。
procedure.shpostgresql=# \q
ロール(ユーザ)の作成
-
データベースに接続する。
-
ロール(ユーザ)を確認する。
procedure.shpostgresql=# \du
result.shList of roles Role name | Attributes | Member of ----------+------------------------------------------------------------+----------- nsuhara | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
-
ロール(ユーザ)を作成する。
procedure.shpostgresql=# CREATE ROLE "<role_name>" LOGIN PASSWORD "password";
example.shpostgresql=# CREATE ROLE "nsuhara" LOGIN PASSWORD "nsuhara";
-
ロール(ユーザ)を削除する。
procedure.shpostgresql=# DROP ROLE "<role_name>";
example.shpostgresql=# DROP ROLE "nsuhara";
データベースの作成
-
データベースに接続する。
-
データベースを確認する。
procedure.shpostgresql=# \l
result.shList of databases Name | Owner | Encoding | Collate | Ctype | Access privileges --------------+---------+----------+---------+-------+--------------------- db.postgresql | nsuhara | UTF8 | C | C | postgres | nsuhara | UTF8 | C | C | template0 | nsuhara | UTF8 | C | C | =c/nsuhara + | | | | | nsuhara=CTc/nsuhara template1 | nsuhara | UTF8 | C | C | =c/nsuhara + | | | | | nsuhara=CTc/nsuhara
-
データベースを作成する。
procedure.shpostgresql=# CREATE DATABASE "<database_name>" OWNER "<role_ name>";
example.shpostgresql=# CREATE DATABASE "db.postgresql" OWNER "nsuhara";
-
データベースを削除する。
procedure.shpostgresql=# DROP DATABASE "<database_name>";
example.shpostgresql=# DROP DATABASE "db.postgresql";
データベースのマイグレーション
-
Flaskの環境変数を設定する。
-
データベースをマイグレートする。
procedure.sh~$ flask db init ~$ flask db migrate ~$ flask db upgrade
レコードの削除
-
データベースに接続する。
-
レコードを削除する。
procedure.shpostgresql=# delete from <table_name>;
-
自動採番を初期化する。
procedure.shpostgresql=# select setval ('<table_name>_id_seq', 1, false);