SqlAlchemy+PyMySQL+Pandasでread_sqlを実行するとObjectNotExecutableErrorエラーが発生する問題への対応

この記事は公開から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

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする