概要
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データベースに接続するようになったのでしょう。
以上です!