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(Django) x AWS 一人アドベントカレンダーAdvent Calendar 2024

Day 11

【Python】エラー「cannot import name '_mysql' from partially initialized module 'MySQLdb'」の原因

Posted at

概要

AWS LambdaでPythonプログラムを実装していたら以下のエラーに遭遇。
原因と解決方法を紹介します。

[ERROR] Runtime.ImportModuleError: Unable to import module 'xxx.main': cannot import name '_mysql' from partially initialized module 'MySQLdb' (most likely due to a circular import) (/opt/python/lib/python3.12/site-packages/MySQLdb/init.py)

Lambda環境はarm64のPython3.12です。

原因

エラーメッセージに「most likely due to a circular import」とあるように、多くの場合は循環インポートが原因らしいです。互いに参照しちゃってるパターンですね。

ただ、今回私は自分の書いたコードの中にそのようなものは見当たらず。
メッセージにもmysqlのことが書いてあるのでモジュールのインポートでエラーが起きているらしいことがわかります。

調べてみると、SQLAlchemyとMySQLdbを使っていると、MySQLdbモジュールの初期化中に循環インポートが発生してエラーになることがあるらしい。

解決方法

ということで、MySQLdbではなくPyMySQLを使用するように変更してみました。
修正内容は以下です。

# 元々のコード
url = (f'mysql://{self.db_user}:{self.db_password}@{self.db_host}:'
       f'{self.db_port}/{self.db_dbname}')

# pymysqlを使用したコード
url = (f'mysql+pymysql://{self.db_user}:{self.db_password}@{self.db_host}:'
       f'{self.db_port}/{self.db_dbname}')

これでもう一度実装すると、エラーがなくなりました。

SQLAlchemyがPyMySQLドライバを使用してMySQLデータベースに接続するようになったのでしょう。
以上です!

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?