Symfoware

Symfowareについての考察blog

データベースのスキーマ変更管理ツール「alembic」の基本的な使い方

何かのドキュメントで、データベース構造の管理は「alembic」を使ってるというのをみました。
alembic 0.6.3 - A database migration tool for SQLAlchemy.


スキーマの変更、普段はテスト環境に実行したクエリをテキストで保存してます。
なんだか便利そうなので調べてみました。


インストール



Ubuntu 12.04にインストールしてみます。
Python製のツールなので、Pythonが動けばどこでも使えるはず。

pipでインストールしました。


$ sudo pip install alembic



SQLAlchemyも合わせてインストールされます。



$ alembic -h



で、ヘルプが表示されればインストール成功です。




はじめてのマイグレーション



FreeBSD 10.0 + MariaDB 5.5に対してマイグレーションしてみます。
FreeBSD 10.0にMariaDBをインストールする(pkg install使用)
MariaDB 5.5の外部接続許可

実行するUbuntuには、MySQL-pythonをインストールしておきました。
MariaDB 5.5にUbuntu 12.04 + Pythonで接続する(MySQL-python使用)


こちらのチュートリアルを参考に進めていきます。
http://alembic.readthedocs.org/en/latest/tutorial.html



まず、以下のコマンドで雛形を作成します。


alembic init [設定名]




「mydb」という設定名で実行してみました。


$ alembic init mydb
Creating directory /somewhere/mydb ... done
Creating directory /somewhere/mydb/versions ... done
Generating /somewhere/mydb/env.pyc ... done
Generating /somewhere/mydb/README ... done
Generating /somewhere/alembic.ini ... done
Generating /somewhere/mydb/env.py ... done
Generating /somewhere/mydb/script.py.mako ... done
Please edit configuration/connection/logging settings in
'/somewhere/alembic.ini' before proceeding.





実行したディレクトリに、mydb、mydb/versionsというディレクトリが作成されます。

「alembic.iniを編集してね」とのことなので、ファイルの中身を確認します。
絶対に変更しなきゃいけない箇所はここ。


sqlalchemy.url = driver://user:pass@localhost/dbname




データベースへの接続情報を記載します。
具体的に何を指定すれば良いのかわからなかったのですが、
SQLAlchemyで使用する接続文字列を記載すればよさげ。

今回は、MySQL-Pythonを使用してMariaDBに接続するので、
http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqldb


mysql+mysqldb://user:pass@host/dbname?charset=utf8



こういう形式を指定します。
今回指定した形式は以下のとおり。


sqlalchemy.url = mysql+mysqldb://admin:P@ssword@192.168.1.101/sample?charset=utf8






設定を変更したら、


alembic revision -m "[コメント]"



というコマンドを実行して、マイグレーション用のソースファイルを生成します。


こんなコマンドを実行しました。


alembic revision -m "create first table"




実行すると、versionsディレクトリにソースが生成されます。
このファイルを変更して、スキーマの定義を行います。


$ alembic revision -m "create first table"
Generating /home/baranche/dev/python/mariadb/mydb/versions/c913f89d026_create_fi
rst_table.py ... done






「mydb/versions」に生成された「c913f89d026_create_first_table.py」の
中身を見てみるとこんな感じ。


  1. """create first table
  2. Revision ID: c913f89d026
  3. Revises: None
  4. Create Date: 2014-03-18 22:53:53.144428
  5. """
  6. # revision identifiers, used by Alembic.
  7. revision = 'c913f89d026'
  8. down_revision = None
  9. from alembic import op
  10. import sqlalchemy as sa
  11. def upgrade():
  12.     pass
  13. def downgrade():
  14.     pass




チュートリアルを参考に、upgradeとdowngradeのメソッドの内容を記載します。
SQLAlchemyを使った事無いのでなんともですが、使ったことがある人は見慣れた記載なのかと。

upgradeにidというintフィールドと、usernameというvarcharのフィールドを定義します。
downgradeには、デーブルをドロップする定義を記載します。


  1. def upgrade():
  2.     op.create_table(
  3.         'test',
  4.         sa.Column('id', sa.Integer, primary_key=True),
  5.         sa.Column('username', sa.String(32), nullable=False),
  6.     )
  7. def downgrade():
  8.     op.drop_table('test')





upgrade headと指定して、最新バージョンの定義までマイグレーションを実行。


alembic upgrade head




実行してみます。


$ alembic upgrade head
INFO [alembic.migration] Context impl MySQLImpl.
INFO [alembic.migration] Will assume non-transactional DDL.
INFO [alembic.migration] Running upgrade None -> c913f89d026, create first table





alembic_versionというバージョン管理用のテーブルと、
指定したtestテーブルが作成されました。


MariaDB [sample]> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| alembic_version |
| test             |
+------------------+
2 rows in set (0.00 sec)


MariaDB [sample]> show columns from test;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra         |
+----------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO | PRI | NULL    | auto_increment |
| username | varchar(32) | NO |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+









二回目のマイグレーション



testテーブルに「nickname」というフィールドを追加してみます。
alembic revisionコマンドでひな形を作成。


alembic revision -m "add nickname"




実行すると、最初と同様versionsディレクトリにひな形が生成されます。


$ alembic revision -m "add nickname"
Generating
/home/baranche/dev/python/mariadb/mydb/versions/199d0b039d76_add_nickname.py ... done





upgradeに列の追加。
downgradeに列の削除のオペレーションを記載します。


  1. """add nickname
  2. Revision ID: 199d0b039d76
  3. Revises: c913f89d026
  4. Create Date: 2014-03-18 23:20:42.835360
  5. """
  6. # revision identifiers, used by Alembic.
  7. revision = '199d0b039d76'
  8. down_revision = 'c913f89d026'
  9. from alembic import op
  10. import sqlalchemy as sa
  11. def upgrade():
  12.     op.add_column('test', sa.Column('nickname', sa.String(32)))
  13. def downgrade():
  14.     op.drop_column('test', 'nickname')




upgradeを実行。


$ alembic upgrade head
INFO [alembic.migration] Context impl MySQLImpl.
INFO [alembic.migration] Will assume non-transactional DDL.
INFO [alembic.migration] Running upgrade c913f89d026 -> 199d0b039d76, add nickname




列が追加されました。


MariaDB [sample]> show columns from test;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra         |
+----------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO | PRI | NULL    | auto_increment |
| username | varchar(32) | NO |     | NULL    |                |
| nickname | varchar(32) | YES |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)








ダウングレード



ダウングレードして「nickname」列の追加を取り消します。

最新から一個前に戻すには、


downgrade [戻すバージョン数]



を実行します。



$ alembic downgrade -1
INFO [alembic.migration] Context impl MySQLImpl.
INFO [alembic.migration] Will assume non-transactional DDL.
INFO [alembic.migration] Running downgrade 199d0b039d76 -> c913f89d026, add nickname




nickname列がドロップされました。


MariaDB [sample]> show columns from test;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra         |
+----------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO | PRI | NULL    | auto_increment |
| username | varchar(32) | NO |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)






初期状態に戻すにはbaseを指定します。


alembic downgrade base




実行してみます。


$ alembic downgrade base
INFO [alembic.migration] Context impl MySQLImpl.
INFO [alembic.migration] Will assume non-transactional DDL.
INFO [alembic.migration] Running downgrade c913f89d026 -> None, create first table




バージョン管理用のテーブル以外削除されました。


MariaDB [sample]> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| alembic_version |
+------------------+
1 row in set (0.01 sec)




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/18(火) 23:43:04|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python alembicで、リビジョンの命名規則変更 | ホーム | MariaDB 5.5にUbuntu 12.04 + Pythonで接続する(MySQL-python使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1351-34afc054
この記事にトラックバックする(FC2ブログユーザー)