概要
Alembicでカラム情報を変更しようとしたら以下のエラーになりました。
原因と解決方法がわかったので紹介します。
ERROR [alembic.util.messaging] All MySQL CHANGE/MODIFY COLUMN operations require the existing type. FAILED: All MySQL CHANGE/MODIFY COLUMN operations require the existing type.
前提
- db:mysql8.0
- python:3.12
- alembic:1.13.2
- SQLAlchemy:2.0.32
原因
Alembic(SQLAlchemy?)ではカラム情報を変更する際に、既存のカラムの型を指定する必要があるため、上記のエラーが発生していました。
ALTER COLUMN
操作を行う際に、既存のカラムの型を明示的に指定する必要があるとのこと。
エラーメッセージにもあるexisting_type
で指定ができそうです。
解決方法
以下が、Alembicのマイグレーションファイルのビフォーアフターです。
create_date
カラムにserver_default
(デフォルト値)を新規に追加するマイグレーションでした。
before(エラーが表示されたコード)
op.alter_column('sample_table', 'create_date', server_default=None), nullable=False)
after(エラーが解消されたコード)
op.alter_column('sample_table', 'create_date', existing_type=mysql.DATETIME(), server_default=sa.text('now()'), nullable=False)
上記のように、existing_type
引数を使用して既存のカラムの型を指定することで、エラーがなくなりました。
参考
existing_type – Optional; a TypeEngine type object to specify the previous type. This is required for all MySQL column alter operations that don’t otherwise specify a new type, as well as for when nullability is being changed on a SQL Server column. It is also used if the type is a so-called SQLAlchemy “schema” type which may define a constraint (i.e. Boolean, Enum), so that the constraint can be dropped.
https://alembic.sqlalchemy.org/en/latest/ops.html