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

Plotly Dash回调错误:从数据库拉取数据时K线图无法显示

问题描述

首次使用Plotly Dash实现股票K线图可视化,从CSV拉取数据时图表正常运行,但从SQLite数据库拉取数据时出现回调错误(Call Back Error: updating graph.figure),图表无法正常显示。

用户代码如下:

from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
import pandas as pd


app = Dash(__name__)

conn = sqlite3.connect('stocks.db')
cursor = conn.cursor()


app.layout = html.Div([
    html.H4('Apple stock candlestick chart'),
    dcc.Checklist(
        id='toggle-rangeslider',
        options=[{'label': 'Include Rangeslider',
                  'value': 'slider'}],
        value=['slider']
    ),
    dcc.Graph(id="graph"),
])


@app.callback(
    Output("graph", "figure"),
    Input("toggle-rangeslider", "value"))
def display_candlestick(value):
    
    cursor = conn.cursor()
    df = pd.read_sql("SELECT Datetime, Open, High, Low, Close FROM stock_data WHERE Symbol = ?", conn, params=('AAPL',))   


    fig = go.Figure(go.Candlestick(
        x=df['Datetime'],
        open=df['Open'],
        high=df['High'],
        low=df['Low'],
        close=df['Close']
    ))
    fig.update_layout(
        xaxis_rangeslider_visible='slider' in value
    )

    return fig

app.run_server(debug=True)
修复方案
  • 1. 补全缺失的依赖导入
    代码中未导入sqlite3库,这是数据库连接失败的直接原因,在代码开头添加:

    import sqlite3
    
  • 2. 修正数据格式问题

    • 数据库中Datetime字段可能存储为字符串,需转换为Pandas可识别的日期类型,在读取数据后添加:
      df['Datetime'] = pd.to_datetime(df['Datetime'])
      
    • 检查Open/High/Low/Close字段是否为数值类型,若为字符串需转换:
      df[['Open', 'High', 'Low', 'Close']] = df[['Open', 'High', 'Low', 'Close']].astype(float)
      
  • 3. 优化数据库连接逻辑
    回调函数内无需重复创建cursor,pd.read_sql可直接使用已建立的conn,移除冗余的cursor = conn.cursor()语句。

  • 4. 添加异常捕获定位错误
    在回调函数中加入异常捕获,便于查看具体错误信息,避免应用崩溃:

    @app.callback(
        Output("graph", "figure"),
        Input("toggle-rangeslider", "value"))
    def display_candlestick(value):
        try:
            df = pd.read_sql("SELECT Datetime, Open, High, Low, Close FROM stock_data WHERE Symbol = ?", conn, params=('AAPL',))
            df['Datetime'] = pd.to_datetime(df['Datetime'])
            df[['Open', 'High', 'Low', 'Close']] = df[['Open', 'High', 'Low', 'Close']].astype(float)
            
            fig = go.Figure(go.Candlestick(
                x=df['Datetime'],
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close']
            ))
            fig.update_layout(
                xaxis_rangeslider_visible='slider' in value
            )
            return fig
        except Exception as e:
            print(f"回调错误详情: {str(e)}")
            return go.Figure()
    

内容的提问来源于stack exchange,提问作者Pravin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:53:35