Исправление AttributeError, возникающего при вызове pandas' read_sql_query с помощью SQLAlchemy v2.0.0

Недавно я столкнулся со многими разработчиками Python, жалующимися на ошибку, возникающую при попытке вызвать функцию pandas read_sql_query(), которая используется для чтения SQL-запроса в pandas DataFrame. В частности, при вызове read_sql_query с запросом SQL и механизмом SQLAlchemy мы должны наблюдать следующее AttributeError:
line 1405, in execute return self.connectable.execution_options().execute(*args, **kwargs) AttributeError: 'OptionEngine' object has no attribute 'execute'
В этом уроке мы продемонстрируем, как воспроизвести ошибку, затем обсудим, в первую очередь, ее причину, и, наконец, мы обсудим возможные решения, которые навсегда устранят ошибку. Давайте начнем!
Воспроизведение ошибки
Чтобы воспроизвести ошибку, нам сначала нужно создать виртуальную среду, а затем установить пакеты pandas и sqlalchemy:
# Create a Python venv $ python3 -m venv ~/test-venv # Activate the venv $ source ~/test-venv/bin/activate # Install pandas and sqlalchemy $ python3 -m pip install pandas sqlalchemy==2.0.0
Теперь предположим, что у нас есть локальный экземпляр MySQL с базой данных с именем mydb и мы хотим загрузить таблицу my_table в кадр данных pandas, нам нужно будет выполнить следующие шаги:
- Создайте объект SQLAlchemy
Engine, используя функциюcreate_engine, которая затем перейдет к функцииread_sql_querypandas и будет использоваться для подключения к целевой базе данных. - Создайте запрос, который читает из таблицы базы данных
- Наконец, вызовите
read_sql_queryи предоставьте как объект механизма, так и запрос SQL, чтобы загрузить таблицу MySQL в DataFrame.
Вот код, который реализует шаги, описанные выше:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:pass@localhost:3306/mydb')
query = 'SELECT * FROM my_table'
df = pd.read_sql_query(query, engine)
Теперь, если вы попытаетесь запустить фрагмент кода — и предполагая, что вы также используете SQLAlchemy v2.0.0 — вы должны ожидать следующую ошибку:
AttributeError: 'OptionEngine' object has no attribute 'execute'
Почему мы видим эту ошибку?
В новом основном выпуске SQLAlchemy для версии 2.0.0 удален метод Engine.execute, который вызывался функцией read_sql_query pandas. Учитывая тот факт, что в текущих версиях pandas не указан пин-код, который не позволяет пакету установить новейшую версию SQLAlchemy, есть вероятность, что вы столкнетесь с этой проблемой.
Как исправить ошибку
Теперь, чтобы избавиться от ошибки, у нас есть несколько вариантов для рассмотрения. Первым подходом может быть понижение версии пакета SQLAlchemy до более ранней версии, чем последний выпуск 2.0.0.
python3 -m pip install --upgrade 'sqlalchemy<2.0'
Обратите внимание, однако, что я бы не рекомендовал этот подход, учитывая, что он не позволяет нам использовать преимущества новых функций и потенциальных исправлений ошибок, представленных в последних версиях SQLAlchemy.
Если у вас нет веских причин для понижения версии SQLAlchemy, вы можете вместо этого создать TextClause, который соответствует текстовой строке SQL, используя sqlalchemy.text функцию. Обратите внимание, что вместо передачи объекта двигателя мы должны вместо этого передать объект Connection, который выводится при вызове метода connect() для Engine:
import pandas as pd
from sqlalchemy import create_engine, text
engine = create_engine('mysql+pymysql://root:pass@localhost:3306/mydb')
query = 'SELECT * FROM my_table'
df = pd.read_sql_query(sql=text(query), con=engine.connect())
Обратите внимание, что вы даже можете воспользоваться преимуществами конструкции Begin-Once, которую мы можем использовать в качестве диспетчера контекста, как показано ниже:
import pandas as pd
from sqlalchemy import create_engine, text
engine = create_engine('mysql+pymysql://root:pass@localhost:3306/mydb')
query = 'SELECT * FROM my_table'
with engine.begin() as conn:
df = pd.read_sql_query(sql=text(query), con=conn)
Обратите внимание, что исправление также было применено к pandas (подробнее см. этот запрос на включение), чтобы сделать пакет совместимым с новым синтаксисом SQLAlchemy, и ожидается, что оно будет выпущено как часть pandas v2.0.0 (см. Примечания к выпуску). »). На момент написания этой статьи pandas v2.0.0 еще не был доступен, но в случае, если он был выпущен, рекомендуемый подход к решению проблемы SQLAlchemy — фактически обновить версию pandas до v2.0.0, если это возможно.
Последние мысли
В сегодняшней статье мы обсудили распространенную ошибку метода pandas read_sql_query, которая была результатом последней версии SQLAlchemy, а именно v2.0.0.
Мы увидели, как можно воспроизвести ошибку, а также обсудили несколько возможных исправлений, которые устранят ошибку. Я надеюсь, что это руководство помогло вам решить проблему.
👉 Стань участником и читай все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.
👇Похожие статьи, которые вам также могут понравиться👇
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу