【发布时间】:2021-09-09 08:23:42
【问题描述】:
我创建了一个实时更新的仪表板应用程序,该应用程序连接到面向公众的 AWS Postgres 数据库。我已将 db 连接放在我的回调中,因此它会更新,但我发现检索数据和创建图表需要很长时间,因此如果间隔时间减少到 10 秒或更短,则根本不会加载图表.我尝试将数据存储在 dcc.store 中,但初始加载仍然需要很长时间。我的缩写代码写在下面。我假设延迟时间来自连接到数据库的引擎,因为我只读取几行和几列。有没有办法加快速度?
import plotly.graph_objs as go
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
from plotly.subplots import make_subplots
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String, func, Date, ARRAY
from sqlalchemy.orm import sessionmaker
app = dash.Dash(__name__, external_stylesheets=[BS], suppress_callback_exceptions=True, update_title=None)
server=app.server
app.layout = html.Div([
dcc.Store(id='time', storage_type='session'),
dcc.Store(id='blood_pressure', storage_type='session'),
html.Div(dcc.Graph(id='live-graph', animate=False), className='w-100'),
html.Div(id= "testing"),
dcc.Interval(
id='graph-update-BP',
interval=30000,
n_intervals=0
)]), width={"size": 10, "offset": 0.5}),
@app.callback(
dash.dependencies.Output('live-graph', 'figure'),
dash.dependencies.Output('blood_pressure', 'data'),
dash.dependencies.Output('time', 'data'),
[dash.dependencies.Input('graph-update-BP', 'n_intervals')],
Input('live-graph', 'relayoutData'),
)
def update_graph_scatter_1(n):
trace = []
blood_pressure = []
time = []
engine = create_engine("postgresql://username:password@address:5432/xxxxx", echo=True, future=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = automap_base()
Base.prepare(engine, reflect=True)
User = Base.classes.users
Datex = Base.classes.data
for instance in session.query(Datex).filter(Datex.user_id == 3).filter(Datex.date_time == 'Monday,Apr:26'):
blood_pressure.append([instance.systolic, instance.mean, instance.diastolic])
time.append(instance.time)
for i in range(0, len(blood_pressure)):
trace.append(go.Box(y=blood_pressure[i],
x=time[i],
line=dict(color='#6a92ff'),
hoverinfo='all'))
fig = make_subplots(rows=1, cols=1)
def append_trace():
for i in range(0, len(trace)):
fig.append_trace(trace[i], 1, 1)
append_trace()
return fig, blood_pressure, hr,
【问题讨论】:
-
引擎创建和自动映射应该只做一次,如果可能的话。
-
出于安全考虑,我建议不要在这篇文章中包含 DB_URI。使用环境变量将其切换出来。 (我们将使用我们的想象力来了解该数据库连接是什么)。
-
我同意@snakecharmerb --> 这个应用程序可以从模块化中受益。
标签: postgresql amazon-web-services sqlalchemy plotly-dash