LoginSignup
3
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-07

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4