LoginSignup
8
8

More than 5 years have passed since last update.

SQLAlchemy-migrateでスキーマ変更する方法

Last updated at Posted at 2019-02-27

概要

 今やっている開発に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を整合性がとれるように書かなきゃいけないのはちょっとめんどくさいかも・・・

8
8
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
8
8