我正在使用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