概要
今やっている開発にSQLAlchemy-migrateを使用していて、本番環境での運用が始まった後、カラムを変更しようと思った時にやり方が分からなかったので調べました。
動作環境
- Debian 9.7
- python 3.6.0
- MySQL 5.7
- SQLAlchemy 1.2.18
- sqlalchemy-migrate 0.12.0
- mysqlclient 1.4.2
内容
カラム追加
create
メソッドで新規カラムを作成できます。
引数には追加したいTable
オブジェクトを指定します。
どうやらカラムの追加位置は指定できないようなので、一番後方の列に配置されるみたいです。
from sqlalchemy import *
from migrate import *
from sqlalchemy.dialects.mysql import VARCHAR
def upgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
Column('new_column', VARCHAR(255)).create(mytable)
def downgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
mytable.c.new_column.drop()
カラム削除
drop
メソッドでカラムを削除できます。
カラム追加とは違い、Table
オブジェクトのc
メソッドから削除したいカラム名を指定しています。
from sqlalchemy import *
from migrate import *
from sqlalchemy.dialects.mysql import DATETIME
def upgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
mytable.c.new_column.drop()
def downgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
Column('new_column', VARCHAR(255)).create(mytable)
カラム変更
alter
メソッドで既存カラムの内容を変更できます。
削除同様、Table
オブジェクトのc
メソッドから変更したいカラム名を指定しています。
引数には以下項目が指定できます。
- name - カラム名
- type - データ型
- default - デフォルト値
- nullable - NULL許可
from sqlalchemy import *
from migrate import *
from sqlalchemy.dialects.mysql import VARCHAR, DATETIME
def upgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
mytable.c.new_column.alter(name='mod_column', type=DATETIME, default='デフォルト値', nullable=True)
def downgrade(migrate_engine):
meta = MetaData(bind=migrate_engine)
mytable = Table('mytable', meta, autoload=True)
mytable.c.new_column.alter(name='new_column', type=VARCHAR(255), nullable=False)
つぶやき
downgrade
を整合性がとれるように書かなきゃいけないのはちょっとめんどくさいかも・・・