Dash / Plotly / Python更新单元格上的可编辑表,单击或单击,然后单击按钮将新行添加到DataTable

时间:2019-01-17 14:32:34

标签: python-3.x plotly-dash

我正在使用Dash / Python,并且有一个从数据库填充的DataTable(实验)。我想做的是,当我开始在表中的任何单元格中键入要在数据库中更新的内容时,并且当我单击“添加新行”时,将使用最新索引号添加一个新的空行。现在,更新表和插入行可以分别正常工作,但是我无法区分单击按钮和单击表内部。我正在尝试在Python的if-else循环中执行此操作,但是此代码无法正常工作。单击该按钮,if n_clicks不起作用并且如果总是调用数据库内部更新,无论是否添加新行,我都无法正确捕获。

这是负责添加新行(插入数据库)和更新表单元(更新数据库)的代码。每次我点击“添加行”按钮时,我也不想运行“如果”中的更新。点击“添加新行”按钮应仅执行代码的“省略号”部分,但为此,我需要区分点击次数。我目前所拥有的方式无法做到这一点。我试图提取将新行添加到新函数中的功能,但是为此我需要具有相同的输出Output('my-datatable','rows'),而Dash不支持它。还有其他方法吗?我正在使用数据表实验。

import dash_table_experiments as dt
from dash.dependencies import Input, Output, State

app.layout = html.Div(children=[
    dt.DataTable(
        id='my-table',
        rows=df.sort_values('id').to_dict('records'),
        editable=True,
        row_update=True,
        filterable=True,
        sortable=True,
        row_selectable=True
    ),
    html.Button('Add Row', id='add-row-button', n_clicks=0)])

@app.callback(
Output('my-table', 'rows'),
[Input('my-table', 'row_update'),
Input('add-row-button', 'n_clicks')],
[State('my-table', 'rows')])
def update_rows(row_update, n_clicks, rows):
    if (type(row_update) != bool):
        value = list(row_update[0]['updated'].values())[0]
        column = list(row_update[0]['updated'].keys())[0]
        row_index = row_update[0]['from_row']

        query=f"""BEGIN
            UPDATE my_table
            SET  {column}='{value}'
            WHERE id={row_index + 1}
          END;"""

        cursor.execute(query)
        connection.commit()

        get_query = "SELECT * FROM my-table ORDER BY id"
        rows = pd.read_sql(get_query, connection)
        rows = rows.sort_values('id').to_dict('records')

    # else if 'add new row' button has been clicked, 
    # insert a new empty row in a database which will show as a new row 
    # with index number on a DataTable and treat it as an update later

    elif n_clicks:
        query_insert = f"""BEGIN
                      INSERT INTO my-table
                      DEFAULT VALUES
                   END;"""

        cursor.execute(query_insert)
        connection.commit()

        get_query = "SELECT * FROM my-table ORDER BY id"
        rows = pd.read_sql(get_query, connection)
        rows = rows.sort_values('id').to_dict('records')

    return rows

0 个答案:

没有答案