SQLAlchemyのマイグレーションツール Alambic導入時のトラブルシューティングまとめ

SQLAlchemyとAlembic を導入した際、エラーが出ることが多かったので、紹介します。

SQLAlchemyではコマンドでの操作やAlter Tableなどは行えませんが、

Alembicではコマンドを用いたスキーマの操作やAlter Tableを行うことができ、便利です。

目次

  1. sqlalchemy.exc.ArgumentError
  2. sqlalchemy.exc.InvalidRequestError
  3. AttributeError
  4. ImportError
  5. ERROR [alembic.util.messaging]

SQLAlchemy とは

PythonのORM(Object Relational Mapper)です。

alembic とは

SQLAlchemy を使用した データベースmigrationライブラリです。

1. sqlalchemy.exc.ArgumentError

1-1

sqlalchemy.exc.ArgumentError: Mapper mapped class User->users could not assemble any primary key columns for mapped table ‘users’

このエラーはカンマをつけていたり、

Column()の中にカラム名を書いていたりすることが原因で起きます。

解決法としてはカンマを付けず「id = Column()」のような形で定義しなければいけないです。

1-2

sqlalchemy.exc.ArgumentError: Error creating backref ‘users’ on relationship ‘UserDataModel.reports’: property of that name exists on mapper ‘mapped class ReportDataModel->reports’

このエラーはrelationshipのbackrefで別のモデルで定義されたrelationshipの変数名を定義した際に起きます。

解決法としては別名で定義する、もしくはbackrefを用いていないrelationshipを削除する必要があります。1対多の1側でbackrefを用いている際は、多側ではrelationshipは不要です。

https://docs.sqlalchemy.org/en/14/orm/backref.html

2. sqlalchemy.exc.InvalidRequestError

sqlalchemy.exc.InvalidRequestError: When initializing mapper mapped class UserDataModel->users, expression ‘ReportDataModel’ failed to locate a name (‘ReportDataModel’). If this is a class name, consider adding this relationship() to the <class ‘db.models.user.UserDataModel’> class after both dependent classes have been defined.

このエラーはrelationshipの第一引数に文字列でクラスを指定する必要があるが、 import しないことで起こります。

解決法としては、relationship の第一引数で文字列として指定したクラスを import する必要があります。

3. AttributeError

AttributeError: ‘NoneType’ object has no attribute ‘fullname’

このエラーは SQLAlchemy のモデルが Base を継承していないと起こります。

解決法としてはBaseを継承してあげましょう。

4. ImportError

ImportError: cannot import name ‘UserDataModel’ from partially initialized module ‘db.models.user’ (most likely due to a circular import)

このエラーは循環参照(呼び出し先で呼び出し元が呼び出されている)をしている時に起きます。

解決法としては、TYPE_CHECKINGする必要があります。

TYPE_CHECKINGについては、こちらに詳しく書かれています。

5. ERROR [alembic.util.messaging]

ERROR [alembic.util.messaging] Can’t locate revision identified by ‘90333886164c’
INFO [sqlalchemy.engine.Engine] [generated in 0.00011s] {}
FAILED: Can’t locate revision identified by ‘90333886164c’

このエラーは Alembic で upgrade して、テーブルを作成した後に Alembicのdowngrade でテーブルを消さずに直接 DB からテーブルを削除すると、Alembic が作成したマイグレーションを管理するalembic_version テーブルに upgrade した際のバージョンのレコードが残ることで起きます。

解決法としては、alembic_vesion テーブルのレコードを削除するか、alembic_version テーブル自体を削除する必要があります。

終わりに

SQLAlchemyのモデル定義方法が2通りあったり、マイグレーションならではのエラーなどあったりで、解決に時間を取られたので、SQLAlchemyとAlembicを導入する際はご参考ください。

参考

https://stackoverflow.com/questions/9088957/sqlalchemy-cannot-find-a-class-name

https://qiita.com/kitarikes/items/9c5d6cbc557ed62bb512

https://zenn.dev/ganariya/articles/python-lazy-annotation

https://stackoverflow.com/questions/27399602/sqlalchemy-exc-argumenterror-error-creating-backref



❏❏ TOPIC ❏❏ ------------------------------------------------------------

カスタム自由!フリーECサイトパッケージ
チャットボット導入サービス
WEBシステム開発・スマホアプリ開発はSRIAへ