Edited at

SQLAlchemy で Alter するには?

More than 3 years have passed since last update.

SQLAlchemyAlter のやり方を調べたので、忘備録的に書いておきたいと思います。

しかし残念なことに SQLAlchemy には、Alter を実行するための特別な機能はサポートされていないようです。

一般的には、AlembicSQLAlchemy-Migrate といったマイグレーションツールを使ってスキーマを変更します。

また、どうしても動的にスキーマを変更したい場合は、Connection.execute() または DDLを使います。

公式ドキュメント>Altering Schemas through Migrations

http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations


動作環境


  • Mac OS X 10.11.5

  • Python 3.5.1

  • MySQL Ver 14.14 Distrib 5.7.11, for osx10.11 (x86_64) using EditLine wrapper

  • SQLAlchemy 1.1.0

  • PyMySQL 0.7.4


サンプルコード

テーブルに新しいカラム「kana」を追加するサンプルコードです。


sqlalchemy_alter.py

# -*- coding:utf-8 -*-

import sqlalchemy
import sqlalchemy.ext.declarative

Base = sqlalchemy.ext.declarative.declarative_base()

class Student(Base):
__tablename__ = 'students'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(20))

@staticmethod
def add_column(engine, column):
column_name = column.compile(dialect=engine.dialect)
column_type = column.type.compile(engine.dialect)
engine.execute('ALTER TABLE %s ADD COLUMN %s %s' % (Student.__tablename__, column_name, column_type))

def main():
url = 'mysql+pymysql://root:@localhost/test_db?charset=utf8'

engine = sqlalchemy.create_engine(url, echo=True)

# テーブルをドロップ
Base.metadata.drop_all(engine)

# テーブルを作成
Base.metadata.create_all(engine)

# テーブルにカラムを追加
column = sqlalchemy.Column('kana', sqlalchemy.String(40), primary_key=False)
Student.add_column(engine, column)

if __name__ == '__main__':
main()