意外にデータベースのスキーマがコロコロ変わるので、手動ではなく、自動で、すなわち、DBマイグレーションを可能にするツールを使おうと、SQLAlchemy-migrateと、Alembicを少し試しました。
結果、SQLAlchemy-migrateは使えず、Alembicは期待通りの働きをしてくれました。
Alembicの場合
環境準備
作業フォルダを作成する
C:\>python -V
Python 3.6.3
C:\>mkdir hello-migrate
C:\>cd hello-migrate
仮想環境を作成して必要なパッケージをインストールする
C:\hello-migrate>python -m venv venv
C:\hello-migrate>venv\Scripts\activate
(venv) C:\hello-migrate>
(venv) C:\hello-migrate>pip install sqlalchemy
(venv) C:\hello-migrate>pip install alembic
(venv) C:\hello-migrate>pip install pymysql
マイグレーション
.\sample.py(最初のバージョン。DB内は空)
from sqlalchemy import MetaData, Table, Column, Integer, String, DateTime, Float, Boolean, Text
from sqlalchemy.dialects.mysql import TINYINT, SMALLINT
meta = MetaData()
Table(
'status', meta,
Column('account_id', Integer, primary_key=True, autoincrement=False),
Column('hp', SMALLINT, nullable=False, server_default='30'),
Column('weapon_id', SMALLINT, nullable=False, server_default='1'),
Column('weapon_lv', TINYINT, nullable=False, server_default='0'),
Column('armor_id', SMALLINT, nullable=False, server_default='1'),
Column('armor_lv', TINYINT, nullable=False, server_default='0'),
)
最初のテーブルをサーバに流し込みます。
マイグレーションというより最初なのでテーブル作成
(venv) C:\hello-migrate>set PYTHONPATH=.
(venv) C:\hello-migrate>alembic init migrate-work
(venv) C:\hello-migrate>alembic revision --autogenerate
(venv) C:\hello-migrate>alembic upgrade head
サーバでテーブルを見てみると、期待通りテーブルstatusが追加されています。
mysql> desc status;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| account_id | int(11) | NO | PRI | NULL | |
| hp | smallint(6) | NO | | 30 | |
| weapon_id | smallint(6) | NO | | 1 | |
| weapon_lv | tinyint(4) | NO | | 0 | |
| armor_id | smallint(6) | NO | | 1 | |
| armor_lv | tinyint(4) | NO | | 0 | |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
開発環境のsample.pyに、カラムをひとつ、Column('added_01', DateTime),
追加し、同じようにサーバへ流し込んでみます。
マイグレーションは同じ操作
(venv) C:\hello-migrate>set PYTHONPATH=.
(venv) C:\hello-migrate>alembic revision --autogenerate
(venv) C:\hello-migrate>alembic upgrade head
サーバでテーブルを見てみると、期待通りカラムが追加されていました。
mysql> desc status;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| account_id | int(11) | NO | PRI | NULL | |
| hp | smallint(6) | NO | | 30 | |
| weapon_id | smallint(6) | NO | | 1 | |
| weapon_lv | tinyint(4) | NO | | 0 | |
| armor_id | smallint(6) | NO | | 1 | |
| armor_lv | tinyint(4) | NO | | 0 | |
| added_01 | datetime | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
SQLAlchemy-migrateの場合(←使えず)
環境準備
仮想環境を作成して必要なパッケージをインストールする
(venv) C:\hello-migrate>pip install sqlalchemy
(venv) C:\hello-migrate>pip install sqlalchemy-migrate
(venv) C:\hello-migrate>pip install pymysql
(venv) C:\hello-migrate>pip install mysqlclient
マイグレーション
(venv) C:\hello-migrate>migrate -V
'migrate' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
あら?Scripts\migrateファイルはあるのですが、以下のような内容です。
# !d:programspython3hello-migratevenvscriptspython.exe
# PBR Generated from 'console_scripts'
import sys
from migrate.versioning.shell import main
if __name__ == "__main__":
sys.exit(main())
一行目を見ると、Windows環境は考えられていない節が見て取れます。ネット上にもWindows上での利用は見られないので、そもそもこのパッケージは、Windowsでの利用は考えられていないのかもしれません。
参考
環境
開発環境
- Windows 10 version 1709
- Python 3.6
- SQLAlchemy-migrate 0.11
- Alembic 0.9.9
MySQLサーバ環境
- ホストOS:Windows 10 version 1709
- ゲストOS:CentOS 7.4
- MySQL:5.7