インストール

pip install sqlalchemy-migrate

初期設定

migrate create migration car_quiz_maker

とすると
migrationというディレクトリが作成されてひな形が出来上がる

その中のmanage.pyに接続情報を記述していく

#!/usr/bin/env python
from migrate.versioning.shell import main

if __name__ == '__main__':
    main(debug='False', url='接続情報', repository='.')

この接続情報には
https://monaledge.com/article/279
これでcreate_engineに使っている文字列を使う

この状態で

python manage.py version_control

を実行すると

バージョンに関するテーブルが作成されていることがわかる

postgres@raiu:~$ psql
psql (10.19 (Ubuntu 10.19-0ubuntu0.18.04.1))
Type "help" for help.

postgres=$ \l
postgres=$ \c car_quiz_maker 
You are now connected to database "car_quiz_maker" as user "postgres".
car_quiz_maker=$ \dt
              List of relations
 Schema |      Name       | Type  |  Owner   
--------+-----------------+-------+----------
 public | migrate_version | table | omaemona
(1 row)

テーブルの作成

さて、マイグレーションファイルの作成をしましょう
まずはユーザテーブルを作成したいので

python manage.py script "add user table"

と入力すると、versionsの下に
001_add_user_table.py
というファイルが作成されていると思います。

スペースは勝手にアンダースコアでつないでくれるんですね
便利だ

ファイルの中身は、マイグレーションを知っている人ならなじみのある形になっているでしょう

from sqlalchemy import *
from migrate import *


def upgrade(migrate_engine):
    # Upgrade operations go here. Don't create your own engine; bind
    # migrate_engine to your metadata
    pass


def downgrade(migrate_engine):
    # Operations to reverse the above upgrade go here.
    pass

importしているsqlalchemyの中にいろいろ入っているそうなのでMetaDataやIntegerなどのクラスを使って定義をしていきます

https://sqlalchemy-migrate.readthedocs.io/en/latest/versioning.html

とりあえずこんな感じで書いてみました

from sqlalchemy import *
from migrate import *

meta = MetaData()
 
user = Table(
    'user', meta,
    Column('id',            Integer, primary_key=True, nullable=False),
    Column('name',          String(255), nullable=False, unique=True),
    Column('email',         String(255), nullable=False, unique=True),
    Column('password',      String(255), nullable=False, unique=True),
    Column('created_at',    DateTime, nullable=False),
    Column('updated_at',    DateTime),
)

def upgrade(migrate_engine):
    # Upgrade operations go here. Don't create your own engine; bind
    # migrate_engine to your metadata
    meta.bind = migrate_engine
    user.create()


def downgrade(migrate_engine):
    # Operations to reverse the above upgrade go here.
    meta.bind = migrate_engine
    user.drop()

この状態で

$ python manage.py test

manage.py upgrade
0 -> 1... 
done

とすると、upgradingとdowngradingのテストが走ります。
テストがオッケーだったらupgradeしてテーブルを作成します

python manage.py upgrade

これを実行した後に確認してみるとuserテーブルが作成されています

car_quiz_maker=$ \dt
              List of relations
 Schema |      Name       | Type  |  Owner   
--------+-----------------+-------+----------
 public | migrate_version | table | omaemona
 public | user            | table | omaemona
(2 rows)


car_quiz_maker=$ \d user
                                        Table "public.user"
   Column   |            Type             | Collation | Nullable |             Default              
------------+-----------------------------+-----------+----------+----------------------------------
 id         | integer                     |           | not null | nextval('user_id_seq'::regclass)
 name       | character varying(255)      |           | not null | 
 email      | character varying(255)      |           | not null | 
 password   | character varying(255)      |           | not null | 
 created_at | timestamp without time zone |           | not null | 
 updated_at | timestamp without time zone |           |          | 
Indexes:
    "user_pkey" PRIMARY KEY, btree (id)
    "user_email_key" UNIQUE CONSTRAINT, btree (email)
    "user_name_key" UNIQUE CONSTRAINT, btree (name)
    "user_password_key" UNIQUE CONSTRAINT, btree (password)

こんな感じでちゃんとテーブルが作られていますね

とりあえずマイグレーションの第一歩が踏み出せました