FlaskのColumnをstringからfloatに変更

FlaskのMigrate機能を使ってStringカラムにFloatカラム変更しようとした際に、ハマったので記事にします。

まず初めに、以下の通りカラム変更を行う想定でいました。
しかし、StringからFloatへの型変更はmigrate機能で対応していないようです。

 #String (20)として定義している
price = db.Column(db.String(20), index=True)
↓
# Float型に変更
price = db.Column(db.Float, index=True)

仕方なく、以下の方法で対応しました。
1. 空のリビジョンファイルを生成

flask db revision

2.空のリビジョンファイルが作成されると、以下が記述されたファイルが生成されます。

def upgrade():
    pass


def downgrade():
    pass

3.それを以下のように変更して、直接tableを修正する変更を行いました。

def upgrade():
    op.execute("alter table table_name modify price float;")


def downgrade():
    op.execute("alter table table_name modify price varchar(20);")

この辺りはテーブル定義で将来を見据えて設計することが望ましいと思いますが、途中で変更せざる追えない場合もあると思います。
そういった場合は、参考にしてもらえればと思います。

※注意点
データベースは「MySQL」を対象としています。
ORMを利用するメリットとして、データベースの種類に依存しない書き方ができることですが、この例外設定を行うと、特定のデータベースに依存しますので、複数種のデータベースを利用していたり、将来変更する予定がある場合は、注意が必要です。

そもそも、途中でカラム変更しなければ影響ないですけどね!!


この記事が気に入ったらサポートをしてみませんか?