Pandas告警UserWarning: pandas only supports SQLAlchemy connectable

在更新的pandas版本中,从数据库导入数据时会出现UserWarning,建议使用SQLAlchemy。老的导入方式是通过pymysql连接数据库,然后使用pd.read_sql()。现在推荐使用SQLAlchemy创建engine对象,例如'mysql+pymysql://用户名:密码@主机名:端口/数据库名?charset=utf8',然后将这个engine对象传递给pd.read_sql()。这样可以避免警告并确保兼容性。

Pandas告警UserWarning: pandas only supports SQLAlchemy connectable

一、报错信息

使用老的书写方式从数据库导入数据到pandas, 会打出一条warning信息:

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.

二、老的书写方式

老的书写方式为:

import pymysql
import pandas as pd

db_host = 'localhost'
user = 'root'
passwd = '123456'
db = 'mytestdb'

conn = pymysql.connect(host=db_host,
                       user=user,
                       passwd=passwd,
                       db=db,
                       charset='utf8')

sql = 'SELECT * FROM students'

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_sql(sql, conn)
print(df)

conn.close()

三、新的书写方式

按照提示,推荐使用SQLAlchemy,需要先安装SQLAlchemy库:

pip install sqlalchemy

20221223232955

新版本的pandas库中con参数使用sqlalchemy库创建的create_engine对象 。创建create_engine对象(格式类似于URL地址)

from sqlalchemy import create_engine
import pandas as pd

MYSQL_HOST = 'localhost'
MYSQL_PORT = '3306'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
MYSQL_DB = 'mytestdb'

engine = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8'
                           % (MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB))

sql = 'SELECT * FROM students'

df = pd.read_sql(sql, engine)

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
print(df)

20221223233751

<think>我们正在处理用户关于pandas read_sql函数出现警告的问题。警告信息提示:pandas只支持SQLAlchemy连接或数据库URI字符串。根据引用,解决方案是使用SQLAlchemy创建引擎,然后将该引擎传递给read_sql函数。 步骤: 1. 安装必要的库:确保已安装sqlalchemy和pymysql(或其他数据库驱动)。 2. 使用SQLAlchemy创建引擎,格式为:'dialect+driver://username:password@host:port/database' 3. 将创建的引擎作为第二个参数传递给pd.read_sql。 根据引用[3]和[4]的示例,我们可以写出如下代码: 例如,对于MySQL数据库,使用pymysql驱动: from sqlalchemy import create_engine import pandas as pd # 数据库连接信息 HOST = 'localhost' PORT = '3306' USER = 'root' PASSWORD = 'your_password' DB = 'your_database' # 创建引擎 engine = create_engine(f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DB}?charset=utf8') # SQL查询 sql = 'SELECT * FROM your_table' # 读取数据 df = pd.read_sql(sql, engine) 这样就不会再出现警告。 另外,引用[2]提到,使用老的书写方式(如直接使用pymysql连接对象)会触发警告,因为pandas不再推荐直接使用DBAPI2连接对象,而是推荐使用SQLAlchemy引擎或连接字符串。 因此,总结解决方法:使用SQLAlchemy创建引擎,并用该引擎代替原有的连接对象。 注意:如果使用其他数据库,只需更改dialect和driver部分,例如PostgreSQL可以使用'postgresql+psycopg2://...'。 下面我们按照要求生成回答,包括相关问题。</think>### 解决 Pandas read_sql 的 UserWarning 警告 当使用 Pandas 的 `read_sql` 方法时遇到警告: `UserWarning: pandas only supports SQLAlchemy connectable...` 这表明 Pandas 不再推荐直接使用 DBAPI2 连接对象(如 pymysql.connect()),而是要求使用 **SQLAlchemy 引擎**或**数据库 URI 字符串**。以下是解决方案: #### ✅ 正确解决方法(推荐) ```python from sqlalchemy import create_engine import pandas as pd # 配置数据库连接参数 DB_CONFIG = { 'host': 'localhost', 'port': '3306', 'user': 'root', 'password': '123456', 'database': 'your_db', 'charset': 'utf8' } # 创建 SQLAlchemy 引擎 engine = create_engine( f"mysql+pymysql://{DB_CONFIG['user']}:{DB_CONFIG['password']}" f"@{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}" f"?charset={DB_CONFIG['charset']}" ) # 执行查询(不再警告) sql = "SELECT * FROM your_table" df = pd.read_sql(sql, engine) # 关键:传入引擎而非连接对象 ``` #### ⚠️ 错误写法(触发警告) ```python # 传统 pymysql 连接方式(不再被支持) import pymysql conn = pymysql.connect(**DB_CONFIG) df = pd.read_sql(sql, conn) # 触发 UserWarning ``` #### 关键说明: 1. **SQLAlchemy 引擎**是 Pandas 官方推荐的数据库接口标准[^1][^2] 2. 连接字符串格式:`dialect+driver://user:password@host:port/database?param=value` - 例如 MySQL:`mysql+pymysql://user:pass@host/db` - 例如 PostgreSQL:`postgresql+psycopg2://user:pass@host/db` 3. 支持所有主流数据库(MySQL, PostgreSQL, SQLite, Oracle 等) #### 其他注意事项: - 需额外安装库:`pip install sqlalchemy pymysql`(MySQL 示例) - 特殊字符处理:若密码含`@`或`:`,需使用 `urllib.parse.quote_plus()` 编码 - 连接池控制:通过 `pool_size` 参数管理,如 `create_engine(..., pool_size=5)` --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_cat

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值