Обновление данных da sh с новыми строками посредством обратного вызова - PullRequest
1 голос
/ 13 марта 2020

Я хочу получить обновленную таблицу из запроса sql, который используется в обратном вызове, он будет обновляться каждые несколько секунд. Однако при получении новых строк произошла ошибка. Ударили в течение некоторого времени. Любая помощь будет хороша. Ошибка: Ошибка обратного вызова при обновлении raw_data.data

Код:

import pandas as pd
import dash
import dash_table
from dash.dependencies import Output, Input
import dash_core_components as dcc
import dash_html_components as html
import plotly
import pyodbc

def connectSQLServer(driver, server, db):
    connSQLServer = pyodbc.connect(
        r'DRIVER={' + driver + '};'
        r'SERVER=' + server + ';'
        r'DATABASE=' + db + ';'
        r'Trusted_Connection=yes;',
        autocommit=True
    )
    return connSQLServer

sql_conn = connectSQLServer(
    'ODBC Driver 13 for SQL Server', 'DESKTOP\SQLEXPRESS', 'display')
cursor = sql_conn.cursor()
d = {'x': [], 'y': [], 'z': [], 'a': []}
sql = 'select * from dbo.data2'
cursor.execute(sql)
myresult = cursor.fetchall()
# d = { 'x': [], 'y': [] }
for x in myresult:
    d['x'].append(x[0])
    d['y'].append(x[1])
    d['z'].append(x[2])
    d['a'].append(x[3])
df = pd.DataFrame(d)

app = dash.Dash(__name__)
app.layout = html.Div([dash_table.DataTable(id='raw_data',

                                            columns = [{'name': i, 'id': i} for i in df.columns],
                                            data = df.to_dict("rows"),
                                            ),
                       dcc.Interval(id='interval_component',
                                    interval=1000,
                                    n_intervals=0
                                    )
                       ])
d = {'x': [], 'y': [], 'z': [], 'a': []}

@app.callback(Output('raw_data', 'data'), [Input('interval_component', 'n_intervals')])
def update_table(n_intervals):
    sql_conn = connectSQLServer(
        'ODBC Driver 13 for SQL Server', 'DESKTOP\SQL', 'display')
    cursor = sql_conn.cursor()
    cursor.execute("SELECT * FROM dbo.data2")
    rows = cursor.fetchall()
    for x in rows:
        d['x'].append(x[0])
        d['y'].append(x[1])
        d['z'].append(x[2])
        d['a'].append(x[3])
    df = pd.Dataframe(d)
    return df
if __name__ == '__main__':
    app.run_server(port=7000, debug=True)

1 Ответ

0 голосов
/ 20 марта 2020

Выходные данные df должны быть в формате json. Измените на return df.to_json("records")

Кроме того, нет необходимости выполнять ваш запрос sql дважды. Я бы сказал, создать экземпляр ваших данных с пустыми данными. Ваш обратный вызов сработает при создании экземпляра dcc.Interval, так как вы назначаете n_intervals=0. Все ваши запросы + преобразования могут выполняться в обратном вызове.

...