Flask-SQLAlchemyについて
SQLAlchemyとは、python で用いられる ORM(OR マッパー の 1 つで、 SQL を直書きせずに DB を操作するライブラリで、Flask-SQLAlchemy は、 Flask に合わせて作られた SQLAlchemy です。
Flask-SQLAlchemy をインストール
作業しているところの仮想環境をアクティベートにする。
次に、必要なものをインストールする。
# flask sqlalchemy のインストール
pip install flask sqlalchemy
# flask migrate のインストール
pip install flask migrate
※参照※
https://pypi.org/project/Flask-SQLAlchemy/
https://pypi.org/project/Flask-Migrate/
マイグレーションの手順
マイグレーションとは、プログラムのコードからデータベースにテーブルを作成・編集すること。
マイグレーションの手順
dbの設定を記載しているファイルを設定
# MAC, Linux の場合 ターミナル
export FLASK_APP=myapp.py
# コマンドプロンプトの場合
set FLASK_APP=myapp.py
例)
set FLASK_APP=migrate_model.py
set FLASK_ENV=development ♯開発環境であることを設定(=変更内容が自動反映される)
flask db init
マイグレーションに必要なファイルを格納する
# migrations フォルダを作成。
flask db init
# テーブルの設定を記載したファイルの内容を migrations フォルダに反映する
flask db migrate m "some message"
# migrations フォルダの内容を DB に登録する
flask db upgrade
DBを操作するmigrateファイルの作成(migrate_model.py)-① DB接続
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
#models.pyを配置しているファイルのパス
base_dir = os.path.dirname(__file__)
# DataBaseの接続先を設定
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(base_dir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# SQLAlchemy を扱うためのインスタンス作成
db = SQLAlchemy(app)
# migrate する DB を設定
Migrate(app,db )
※DBに接続するための設定について
参照先:
https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/
SQLALCHEMY_DATABASE_URI
接続するDB の URI
Postgres:postgresql://username:password@localhost/mydatabase
MySQL:mysql://username:password@localhost/mydatabase
Oracle: oracle://username:password@127.0.0.1:1521/sidname
SQLite: sqlite:////absolute/path/to/foo.db
SQLALCHEMY_TRACK_MODIFICATIONS これをTrue にすると、 Flask SQLAlchemy がデータベースの変更を追跡管理して、 シグナルを発生するようになる。ただし、これを有効にすると追加のメモリが必要となる。
SQLALCHEMY_BINDS 複数のデータベースに接続する際に利用される SQLALCHEMY_BINDS = { 'users': 'mysqldb ://localhost/users' 'appmeta': sqlite :////path/to/appmeta.db' }
DBを操作するmigrateファイルの作成(migrate_model.py)-② DBテーブルのクラスを定義(DBモデルの作成)
# モデルPersonの作成
class Persons(db.Model):
# テーブル(テーブル名:persons)の作成
__tablename__ = 'persons'
# カラムidを主キーとして作成
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.Text)
age = db.Column(db.Integer)
def __init__(self,name,age):
self.name = name
self.age = age
クラスを使って、テーブルを作成し、データを挿入する(crud.py)
#crud.py
from model import db,Persons,app
man1=Persons('Taro',18)
man2=Persons('Jiro',17)
man3=Persons('Saburo',16)
with app.app_context():
db.create_all() ♯テーブルを作成
db.session.add_all([man1,man2]) #複数一緒に追加
db.session.add(man3) #1つ追加
db.session.commit()
作業フロー
pip install -U Flask-SQLAlchemy
pip install Flask-Migrate
※参照※
https://pypi.org/project/Flask-SQLAlchemy/
https://pypi.org/project/Flask-Migrate/
マイグレーションの手順
set FLASK_APP=myapp.py
set FLASK_ENV=development
flask run
python crud.py
——————————
マイグレーションレポジトリの作成
——————————
※Flask-Migrate は、flask db xx という flask のサブコマンドで操作します。
migrate_model.py作成
↓
set FLASK_APP=migrate_model.py
flask db init
↓
「migrartions」フォルダが作成される(初期化された状態)
↓
flask db migrate -m “add Person”
↓
「migrartions」フォルダに、マイグレートしたいファイルが作成される(DBモデルのPersonを追加)
「df74fb823e6f_add_person.py」
↓
マイグレーションの内容をDBに反映させる
flask db upgrade
↓
DBに「persons table」のほかに
「alenbic_version table」が作られた
———————————–
更新するとき
———————————–
「migrate_model.py」でDBモデルのクラスに
genderのカラムを追加して、DBに反映させるには
flask db migrate -m “add gender to person”
↓
「migrartions」フォルダに、マイグレートしたファイルが作成される
「49cb3273214d_add_gender_to_person.py」
↓
マイグレーションの内容をDBに反映させる
flask db upgrade