You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django应用中使用pandas read_sql复用连接池的方案咨询

解决方案

方案1:手动通过Django游标读取数据转DataFrame

直接绕过pandas的read_sql对连接类型的检查,全程使用Django的连接池管理连接,完全规避警告且稳定可靠:

import django.db.connection
import pandas as pd

with connection.cursor() as cursor:
    cursor.execute("select employee.name from employee;")
    # 从游标描述中提取列名
    column_names = [desc[0] for desc in cursor.description]
    # 获取所有查询结果
    query_results = cursor.fetchall()
    # 转换为DataFrame
    df = pd.DataFrame(query_results, columns=column_names)

该方法完全依赖Django的连接管理机制,不会额外创建新连接,适配多用户高并发场景。

方案2:过滤特定警告

如果确认当前mysqlclient的DBAPI2连接在pandas 2.2.1下能稳定工作,只是不想看到警告,可以针对性过滤该提示:

import warnings
import django.db.connection
import pandas as pd

# 精准过滤pandas的这个用户警告
warnings.filterwarnings(
    "ignore",
    message=r"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\."
)

df = pd.read_sql("select employee.name from employee;", con=connection)

注意:此方法仅隐藏警告,若后续pandas版本彻底移除对非SQLAlchemy/非sqlite3 DBAPI2连接的支持,可能出现异常,适合临时过渡使用。

方案3:复用Django连接池的SQLAlchemy包装(可选)

如果想适配pandas的官方要求,同时复用Django的连接池,可以基于Django的数据库配置创建SQLAlchemy引擎,确保不额外新建连接池:

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

# 从Django配置中提取数据库参数,构建SQLAlchemy连接字符串
db_conf = settings.DATABASES['default']
db_uri = f"mysql+pymysql://{db_conf['USER']}:{db_conf['PASSWORD']}@{db_conf['HOST']}:{db_conf['PORT']}/{db_conf['NAME']}"

# 创建SQLAlchemy引擎,复用Django的连接池配置
engine = create_engine(
    db_uri,
    pool_size=db_conf.get('CONN_MAX_AGE', 0),
    max_overflow=0
)

# 使用SQLAlchemy引擎执行查询
df = pd.read_sql("select employee.name from employee;", con=engine)

注意:需确保SQLAlchemy的连接池参数与Django的CONN_MAX_AGE等配置一致,避免出现连接管理冲突。


内容的提问来源于stack exchange,提问作者jd80

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:10