Dash应用DataTable报错:Expected an array的解决方法
修复Dash DataTable的
data参数错误 问题根源
你的回调函数statsTable现在返回的是整个dt.DataTable组件对象,但回调绑定的是table_stats的data属性——这个属性要求接收的是数组(也就是你打印的data列表),而不是组件对象,所以Dash才会报错说收到了object类型,不符合预期的数组类型。
具体修复步骤
1. 调整回调函数的返回值
删掉创建table对象的代码,直接返回data数组(也就是df.to_dict('rows')的结果)。如果需要动态更新表格列,还可以同时返回列配置:
@app.callback( # 同时绑定data和columns两个属性 [dash.dependencies.Output('table_stats', 'data'), dash.dependencies.Output('table_stats', 'columns')], [dash.dependencies.Input('dynamic-dropdown', 'value')]) def statsTable(symbols): print(symbols) if symbols == None: raise PreventUpdate placeholders = ", ".join(['%s' for _ in symbols]) sql = f"""SELECT id, companyname, marketcap , to_char(100.0*week52change,'999D99%%'), week52high, week52low , to_char(dividend_yield * 100, '99D99%%'), next_earnings_date , pe_ratio, ROUND(beta,2) FROM security_stats WHERE security_stats.id IN ({placeholders}) """ print(sql) df = postgresql_to_dataframe_v1(conn, sql, symbols, stats_col) # 处理Dash不支持的数据类型:Decimal转float,日期转字符串 decimal_cols = ['week52high', 'week52low', 'pe_ratio', 'Beta'] for col in decimal_cols: df[col] = df[col].apply(lambda x: float(x) if pd.notnull(x) else x) df['Next Earnings Report'] = df['Next Earnings Report'].astype(str) # 生成表格数据和列配置 data = df.to_dict('rows') columns = [{'name': col, 'id': col} for col in df.columns] # 返回数据和列,而不是整个DataTable对象 return data, columns
2. 简化布局中的DataTable定义
因为现在列配置由回调动态生成,布局里只需要保留基础的DataTable结构即可:
dbc.Row([(html.Div(dbc.Container(dt.DataTable( id='table_stats', style_table={'margin-left': '20px', 'margin-right':'45px'} ))))], justify="center")
额外说明
- 为什么要处理Decimal和日期类型?Dash的DataTable无法直接识别Python的
Decimal和datetime.date类型,转换成float/字符串后才能正常渲染表格。 - 如果你的表格列是固定不变的,也可以把
columns配置直接写在布局里,这样回调只需要返回data即可,代码会更简洁。
内容的提问来源于stack exchange,提问作者yung peso
相关产品推荐
相关产品推荐

