skip to content
barorin&

'Engine' object has no attribute 'execute'の対処法|SQLAlchemy

/ 2 min read

Updated:
Table of Contents

問題

SQLAlchemy と pandas を使っていつものように read_sql したところ、エラーが出てしまいました。

AttributeError: 'OptionEngine' object has no attribute 'execute'

create_engine() にオプションを渡していない場合は、次のように Engine のまま出ます。

AttributeError: 'Engine' object has no attribute 'execute'

いずれも原因は同じで、SQLAlchemy 2.0 で Engine.execute() が削除されたことによるものです。pandas が read_sql の内部で con.execute() を呼ぶため、conEngine をそのまま渡しているとこのエラーになります。

解決方法

conEngine ではなく Connection を渡し、SQLを text() でラップすれば解消します。

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy import text as q_text
def connection_db():
"""DB接続"""
SQLALCHEMY_DATABASE_URL = "sqlite:///hoge.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
return engine
engine = connection_db()
# ポイント
# SQLはSQLAlchemyのtext関数を通す
# engineにconnect()メソッドをつける
q = q_text("SELECT * FROM huga_table")
df = pd.read_sql(sql=q, con=engine.connect())

参考

read_sql_query() throws “‘OptionEngine’ object has no attribute ‘execute’” with SQLAlchemy 2.0.0

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で使えるコードや、Ubuntu・Docker等の設定メモなどを書いています。