Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@tchofu

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
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
4
Help us understand the problem. What are the problem?