Pandas read_sql с использованием Django.db.connection

Существует ли рекомендуемый способ использования pandas read_sql из приложения Django? Я использовал гораздо более старую версию pandas, и это работало:

import django.db.connection
import pandas as pd
df = pd.read_sql("select employee.name from employee;", con=connection)

Теперь я получаю эту ошибку от read_sql:

UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.

Запрос, кажется, работает даже с этим предупреждением, но я не хочу рисковать, что он может сломаться. Я использовал Django.db.connection, чтобы pandas использовал пул соединений с БД в Django. Я могу успешно использовать строку соединения с методом read_sql, но я не хочу, чтобы pandas открывал кучу соединений в многопользовательской системе. То же самое с SQLAlchemy - я не хочу добавлять еще один пул соединений в приложение. Есть какие-нибудь советы или обходные пути? Я не нашел ничего в документации по pandas или Django об этом.

Django==3.2
pandas==2.2.1
mysqlclient==2.2.4
MySQL version 8

Предполагая, что вы используете MySQL, ваши настройки Django должны быть примерно такими:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

Вы можете использовать эти настройки для создания движка SQLAlchemy, который будете использовать.

from django.conf import settings
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine(
    "mysql://{user}:{password}@{host}:{port}/{name}".format(
        user=settings.DATABASES["default"]["USER"],
        password=settings.DATABASES["default"]["PASSWORD"],
        host=settings.DATABASES["default"]["HOST"],
        port=settings.DATABASES["default"]["PORT"],
        name=settings.DATABASES["default"]["NAME"],
    )
)

df = pd.read_sql("SELECT employee.name FROM employee", con=engine)

Удачи!

Вернуться на верх