2020年7月31日金曜日

Flask-Migrate で定義したテーブル定義から ER 図を作成する方法

概要

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

参考サイト

0 件のコメント:

コメントを投稿