使用Python+MySQL查询2021年gpsdata表数据出现报错该如何解决
问题解决办法
报错原因说明
- 第一次报错
AttributeError: 'tuple' object has no attribute 'cursor'核心是pd.read_sql_query的参数顺序传反了:该函数第二个参数要求传入数据库连接对象,第三个参数才是SQL占位符对应的参数值。你把日期参数元组放在了第二个位置,pandas把这个元组识别为连接对象调用cursor方法,自然报错。 - 第二次报错
execute command denied to user 'himani'@'%' for routine 'dt.date'是因为你把Python侧的dt.date方法直接写在了SQL语句中,数据库执行SQL时无法识别Python的模块方法,抛出了误导性的权限不足错误,并非你真的没有查询权限。
正确代码示例
首先要确保你使用的dbconnect是有效的数据库连接对象(不是包含连接、游标的元组,如果之前创建连接时返回的是元组,提取出其中的连接对象即可),然后按如下写法调整:
import pandas as pd import datetime as dt # 若你的dbconnect是(连接对象, 游标)格式的元组,先提取连接对象: # conn = dbconnect[0] # 若dbconnect本身就是连接对象,直接用即可 start_date = dt.date(2021, 1, 1) end_date = dt.date(2022, 1, 1) # 按正确顺序传参 df_gpsdata = pd.read_sql_query( ''' SELECT date, car_id, disance_km FROM fleet_gpsdata WHERE date >= %s AND date < %s ''', con=dbconnect, params=(start_date, end_date) ) # pd.read_sql_query已经返回DataFrame,无需重复封装,直接排序即可 df_gpsdata.sort_values(by=["date"], inplace=True, ignore_index=True)
额外说明
如果你的数据库不支持%s格式的占位符(比如Oracle用:1、SQL Server用?),对应调整占位符格式即可,参数化查询的写法可以避免SQL注入风险,不推荐直接把日期拼接到SQL字符串中执行。
内容的提问来源于stack exchange,提问作者Karan Saraogi
相关产品推荐
相关产品推荐

