sqlalchemy
python3
Windows10
Alembic

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

意外にデータベースのスキーマがコロコロ変わるので、手動ではなく、自動で、すなわち、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