Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

意外にデータベースのスキーマがコロコロ変わるので、手動ではなく、自動で、すなわち、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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away