Python查询SQL后合并pandas DataFrame报'DataFrame'对象不可调用错误
报错原因
核心问题为命名冲突:你定义的函数名fundVaR、fundAUM与接收函数返回值的变量名完全一致。第一次调用函数后,全局命名空间中的原函数名会被覆盖为DataFrame类型的变量,后续如果再次尝试调用同名函数,就会触发TypeError: 'DataFrame' object is not callable报错。
同时你的代码还存在一处隐藏的SQL语法问题:SQL语句拼接时,BaseHoldingID的取值和后续的ORDER之间缺少空格,拼接后会生成where BaseHoldingID=3127ORDER by ReportingDate asc的非法SQL,会触发数据库查询报错。
修复方案
- 修改接收返回值的变量名,避免和函数名重名即可解决报错,示例如下:
# 仅需修改调用部分的变量名 var_df = fundVaR(3127) aum_df = fundAUM(3127) fundAUMVaR = pd.merge(var_df, aum_df, on = ['Date','bhID','bhName','Strategy'],how = 'outer')
- 修复SQL拼接的空格问题,在
str(fundbhID)后添加空格即可:
# 以fundVaR函数的else分支为例,fundAUM函数做相同修改 fundVaR = pd.read_sql_query(""" select * from vwExposure_VaR where BaseHoldingID=""" + str(fundbhID) + """ ORDER by ReportingDate asc""" ,conn)
可选优化建议
两个函数的逻辑高度重合,可提取公共逻辑减少冗余代码;直接拼接SQL字符串存在SQL注入风险,建议使用pandas.read_sql_query的参数绑定能力替换字符串拼接,示例如下:
# 参数绑定写法示例 fundVaR = pd.read_sql_query(""" select * from vwExposure_VaR where BaseHoldingID=%s ORDER by ReportingDate asc""" ,conn, params=(fundbhID,))
内容的提问来源于stack exchange,提问作者Herman L
相关产品推荐
相关产品推荐

