Обновить базу данных SQL, отредактировав ячейку в таблице данных Bokeh? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть панель управления, на которой я работаю с приложением Bokeh Server. Одна из вкладок представляет собой таблицу данных с перечнем компьютеров, извлеченных из базы данных SQL (серийный номер, имя, ОС и т. Д.)

Я хотел бы добавить столбец «Примечания», который может редактировать конечный пользователь, который будет обновлять таблицу SQL в фоновом режиме.

Я пытался последовать совету из этого ответа: https://stackoverflow.com/a/49424647/11745820

(я заметил, что это было для Bokeh 0.12.14, у меня работает 1.2)

from bokeh.models import ColumnDataSource
from bokeh.models.widgets import DataTable, TableColumn, HTMLTemplateFormatter
from bokeh.io import curdoc

# Sample dictionary instead of SQL
dict1 = { 
    'serials':['abc123', 'def456', 'foo123', 'bar456'],
    'names':['computer1', 'computer2', 'computer3', 'computer4'],
    'notes':['']*4
}
source = ColumnDataSource(data=dict1)

columns = [
    TableColumn(field="serials", title="x"),
    TableColumn(field="names", title="y"),
    TableColumn(field="notes", title="serials")
]

data_table = DataTable(
    source=source,
    columns=columns,
    width=800,
    editable=True,
)

# Basic function to demonstrate the problem, but I want this to identify
#if a note was entered and update the SQL table with its contents. 

def on_change_data_source(attr, old, new):
    print(old)
    print(new)

    indices = list(range(len(old['notes'])))
    rows = [(i, j, k) for i, j, k in zip(indices, new['serials'], new['notes'])]
    changes = [x for x in rows if x[2] != ''] # Should be comparing old and new here, but it isn't working. 
    #I can run it as is, but then it would be re-writing all of the notes every single time
    for change in changes:
        print(f'UPDATE computers SET notes={change[2]} WHERE serial={change[1]}')

source.on_change('data', on_change_data_source)

curdoc().add_root(data_table)

Я ожидал, что приведенный выше код напечатает старое значение, а затем новое значение после обновления. Тем не менее, старый и новый оба показывают «новое» значение. Поэтому changes - это всегда пустой список и ничего не исправлено (я заменю этот код функцией обновления SQL)

Кроме того, я хочу убедиться, что редактируется только столбец «Заметки» (если это возможно в Bokeh)

...