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)