PythonでDBマイグレーションするには、Alembicが良いかもしれません。SQLAlchemy-migrateはWindowsで使えません

意外にデータベースのスキーマがコロコロ変わるので、手動ではなく、自動で、すなわち、DBマイグレーションを可能にするツールを使おうと、SQLAlchemy-migrateと、Alembicを少し試しました。

結果、SQLAlchemy-migrateは使えず、Alembicは期待通りの働きをしてくれました。

# Alembicの場合

## 環境準備

### 作業フォルダを作成する

```dos
C:\>python -V
Python 3.6.3
C:\>mkdir hello-migrate
C:\>cd hello-migrate
```

### 仮想環境を作成して必要なパッケージをインストールする

```dos
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
```

## マイグレーション

```python:.\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'),
)
```

最初のテーブルをサーバに流し込みます。

```dos:マイグレーションというより最初なのでテーブル作成
(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が追加されています。

```console
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),`追加し、同じようにサーバへ流し込んでみます。

```dos:マイグレーションは同じ操作
(venv) C:\hello-migrate>set PYTHONPATH=.
(venv) C:\hello-migrate>alembic revision --autogenerate
(venv) C:\hello-migrate>alembic upgrade head
```

サーバでテーブルを見てみると、期待通りカラムが追加されていました。

```console
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の場合（←使えず）

## 環境準備

### 仮想環境を作成して必要なパッケージをインストールする

```dos
(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

```

## マイグレーション

```dos
(venv) C:\hello-migrate>migrate -V
'migrate' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

あら？Scripts\migrateファイルはあるのですが、以下のような内容です。

```python
#!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での利用は考えられていないのかもしれません。

# 参考

  * [Alembic(DBのスキーマ管理ツール)導入メモ](https://qiita.com/jp_ibis/items/29d7392dda6604844f67)

# 環境

## 開発環境
  * 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