LoginSignup
12
12

More than 5 years have passed since last update.

SQLAlchemy で Alter するには?

Last updated at Posted at 2016-06-02

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()
12
12
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
12
12