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

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,会触发数据库查询报错。

修复方案
  1. 修改接收返回值的变量名,避免和函数名重名即可解决报错,示例如下:
# 仅需修改调用部分的变量名
var_df = fundVaR(3127)
aum_df = fundAUM(3127)

fundAUMVaR = pd.merge(var_df, aum_df, on = ['Date','bhID','bhName','Strategy'],how = 'outer')
  1. 修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:03