LoginSignup
12
2

はじめに

マイグレーション機能を提供してくれる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)

これでテーブルを複数同時にマイグレーションできます。

参考記事

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2