0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Alembicの「FAILED: All MySQL CHANGE/MODIFY COLUMN operations require the existing type.」エラーの原因

Posted at

概要

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?