概要
eralchemy というツールがあるのでこれを使います
素の SQLAlchemy と連携する方法は結構書かれているのですが Flask-SQLAlchemy と Flask-Migrate を使ったサンプルが少なかったので紹介します
環境
- macOS 10.15.5
- MySQL 8.0.19
- Python 3.8.3
- Flask-SQLAlchemy 2.5.3
- Flask-Migrate 2.5.3
- Flask 1.1.2
インストール
pipenv install eralchemy
サンプルコード
vim my_app/database.py
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from eralchemy import render_er # add
db = SQLAlchemy()
ma = Marshmallow()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
age = db.Column(db.Integer)
__table_args__ = (
db.UniqueConstraint('name', 'age', name='unique_name_age'),
)
item = db.relationship("Item", backref="user")
def __repr__(self):
return "%s,%s,%i" % (self.id, self.name, self.age)
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
name = db.Column(db.String(20))
class UserSchema(ma.Schema):
class Meta:
fields = ("id", "name", "age")
class ItemSchema(ma.Schema):
class Meta:
fields = ("user_id", "name", "user")
user = ma.Nested(UserSchema, many=False)
# add
if __name__ == '__main__':
render_er(db.Model, 'er.png')
説明
基本的には過去に紹介したテーブル定義に render_er
を使って画像を出力する main 部分を追加してあげるだけです
ポイントは render_er
に指定するオブジェクトですが db.Model
を渡します
SQLAlchemy と連携する記事だと declarative_base
から生成したオブジェクトを渡すサンプルが多いのですが Flask-SQLAlchemy を使っている場合は declarative_base
は基本使いません
なので渡すオブジェクトは db.Model
を渡します
動作確認
pipenv run python my_app/database.py