Python跨文件调用MySQL连接查询数据出现AttributeError报错如何解决
错误产生原因
con()函数没有返回合法的数据库连接对象:连接成功分支没有写return语句,默认返回None;连接失败分支返回0,也不属于pd.read_sql()支持的连接类型。pd.read_sql()接收到None后,内部尝试调用.cursor()方法执行查询,自然会抛出NoneType无cursor属性的错误。read_datasets.py中调用连接函数的写法错误:代码中写的是con(直接传递函数对象本身),没有加括号执行函数获取返回值,pd.read_sql()接收到函数对象后同样无法调用.cursor()方法。
修复方案
第一步:修改main.py中的con函数
调整函数逻辑,成功时返回连接对象,失败时抛出明确错误,不需要在函数内创建游标(pd.read_sql会自动处理游标逻辑):
import mysql.connector import pandas as pd def con(): try: # 声明MySQL默认配置 connection = mysql.connector.connect( host="xx", user="xx", passwd="xx", db="xx", ) print("connected") # 成功时返回连接对象 return connection # 连接失败处理 except Exception as e: print(f"cant connect to database: {str(e)}") # 失败时抛出异常方便排查问题 raise if __name__ == '__main__': print("actually in main.py") # 连接MySQL查询数据 temp1 = pd.read_sql("SELECT xx FROM xx", con() ) # 过滤DataFrame中的空值 temp1 = temp1.dropna()
第二步:修改read_datasets.py中的调用写法
执行con函数获取连接对象,再传给pd.read_sql:
import pandas as pd from main import con # 调用con函数加括号获取返回的连接对象 temp1 = pd.read_sql("SELECT xx FROM xx", con()) # 过滤DataFrame中的空值 temp1 = temp1.dropna()
内容的提问来源于stack exchange,提问作者mika
相关产品推荐
相关产品推荐

