SqlAlchemy-migrateを使ってみる
sqlalchemy-migrate.readthedocs.io
- 詳しい作業手順は下記に記載されているので、マネしてやってみる sqlalchemy-migrate.readthedocs.io
インストール
$ pip install sqlalchemy $ pip install sqlalchemy-migrate $ pip install pymysql
- マイグレーションコマンドが利用できるようになっていることを確認する
$ migrate --help
プロジェクトの作成
migrate create "<フォルダ名>" "<リポジトリ名>" migrate create migrate "fastapi"
※リポジトリとは - manage.py、構成ファイル(migrate.cfg)、およびPythonスクリプトまたはSQLファイルのデータベース変更セットスクリプトが含まれています。 sqlalchemy-migrate.readthedocs.io
- 上記のコマンドを実行すると下記のようなフォルダ構成となる
migrate |--README |--__init__.py |--__pycache__ | |--__init__.cpython-39.pyc |--manage.py |--migrate.cfg |--versions | |--__init__.py | |--__pycache__ | | |--__init__.cpython-39.pyc
migrate関連の設定
- 作成されたフォルダ内にあるmanage.pyファイルを開き接続先のDBを指定する。
- 接続方法はインストールドライバによって異なるので気を付ける。下記は
mysqlclientを利用した
#!/usr/bin/env python
from migrate.versioning.shell import main
if __name__ == '__main__':
main(debug='False', url='mysql+pymysql://root:password@db/fastapi?charset=utf8', repository='.')
マイグレーションのバージョン管理をするための準備
- 下記のコマンドを実行する
python manage.py version_control
テーブルの作成
- ユーザーテーブルを作成するマイグレーションファイルを作成する
python manage.py script "add users table"
- 上記コマンドを実行すると
versions/001_add_users_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
- 下記のように修正してユーザーテーブルを作成してみる
from sqlalchemy import *
from migrate import *
from sqlalchemy import Table, Column, MetaData,BIGINT, VARCHAR, DateTime, Text
meta = MetaData()
users = Table(
'users', meta,
Column('id', BIGINT(), primary_key=True, autoincrement=True),
Column('mail_address', VARCHAR(40), nullable=False),
Column('password', VARCHAR(40), nullable=False),
Column('last_login_at', DATETIME),
Column('created_at', DATETIME, nullable=False),
Column('updated_at', DATETIME, nullable=False)
)
def upgrade(migrate_engine):
meta.bind = migrate_engine
users.create()
def downgrade(migrate_engine):
meta.bind = migrate_engine
users.drop()
- 利用できる型は下記の内容となる docs.sqlalchemy.org
マイグレーション実行
# python manage.py upgrade 0 -> 1... done
テーブルが作成されていることを確認する
mysql> desc users; +---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | mail_address | varchar(40) | NO | | NULL | | | password | varchar(40) | NO | | NULL | | | last_login_at | datetime | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +---------------+-------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)