はじめに
マイグレーション機能を提供してくれるAlembicで、複数モデル(複数テーブル)を扱った際に詰まったので簡単に残します。
というか、基本的にモデルは複数作りますよね。
Alembicの基本的な使い方
まだAlembicを入れていないという方はこちらを参考にして入れましょう。
Userモデルのみで実装しているのでモデルは一つです。
ただし記事の最後のコメントにもあるように、env.pyの修正部分でモデルをインポートするようにします。(詳しくは下記)
上記記事修正部分
env.py
# 修正前
# from settings import Base
# target_metadata = Base.metadata
# 修正後
from models import User
target_metadata = User.metadata
複数モデルを使用
そして以下のような複数テーブルを想定します。
models.py
from sqlalchemy import Column, Integer, String
from settings import Base
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
nickname = Column(String)
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(String)
price = Column(String)
複数モデルの際に変更する点も先ほどの修正点と同じenv.pyです。
env.py
from logging.config import fileConfig
from alembic import context
from sqlalchemy import MetaData, engine_from_config, pool
from models import Group, User
...
# target_metadataを定義する直前部分にこの関数を追加
def combine_metadata(*args):
m = MetaData()
for metadata in args:
for t in metadata.tables.values():
t.tometadata(m)
return m
# 変更
target_metadata = combine_metadata(User.Base.metadata, Group.Base.metadata)
これでテーブルを複数同時にマイグレーションできます。
参考記事