この記事は公開から1年以上経過しています。
過去に作成したPythonスクリプトをPython(3.10)+Pandas(1.53)+SQLAlchemy(2.0.2)+PyMySQL(1.0.2)環境で実行したところ、pandasのread_sql()
でエラーが発生してしまったため、その対応についての備忘録。
問題
以下のようなコードで生SQLを使いMySQLからPandasへデータを読み込もうとすると
Exception has occurred: ObjectNotExecutableError
Not an executable object: …
のようなエラーが発生する。
import sqlalchemy as sqlalc
import pandas as pd
engine = sqlalc.create_engine(
f'mysql+pymysql://xxxx'
)
sql = 'SELECT * FROM XXXX'
with engine.connect() as conn:
df = pd.read_sql(sql, conn)
原因
SQLAlchemy 1.4では再現しないため、SQLAlchemy 2.0のバグ?(参考ウェブサイトのGitHub Issue参照)
対応
暫定対応としてread_sql()
に生のSQL文字列ではなくSQLAlchemyのtext()
を渡す。
import sqlalchemy as sqlalc
import pandas as pd
engine = sqlalc.create_engine(
f'mysql+pymysql://xxxx'
)
sql = 'SELECT * FROM XXXX'
with engine.connect() as conn:
# SQLを引き渡す際にtext()を使う
df = pd.read_sql(sqlalc.text(sql), conn)
参考ウェブサイトなど
- GitHub
BUG: ObjectNotExecutableError reading from MySQL with read_sql and SQL string after Sqlalchemy 2.0.0 release #51061
以上です。