Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2019 22:26:38

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция редактирования значений БД

Друзья есть следующая функция, которую реализовал при помощи подсказок со stackoverflow
Но не до конца есть понимание того как она работает:

Собственно сама функция:

     def update_record(self, description, costs, total):
        for selected_item in self.tree.selection():
            self.db.c.execute('''UPDATE finance SET description=?, costs=?, total=? WHERE ID =?''',
                              (description, costs, total, self.tree.set(selected_item, '#1')))
        self.db.conn.commit()

Создаём функцию, которая на вход получает значения трёх переменных:
 def update_record(self, description, costs, total):

Далее у меня есть виджет treeview в главном окне программы, в котором выбираю строку (по клику на неё), значения выбранных элементов которой необходимо изменить.
Для того чтоб изменить, мне их для начала нужно получить. Используем метод selection(), который вернет мне список идентификаторов выбранных элементов.
Организовываю цикл, с помощью которого я могу пройтись по списку полученных идентификаторов:
 for selected_item in self.tree.selection():
И в цикле выполнить SQL запрос к базе:
 '''UPDATE finance SET description=?, costs=?, total=? WHERE ID =?'''
где используем подстановку значений с помощью символов знака вопроса и передаём, вторым параметром метода execute, кортеж значений:
 (description, costs, total, self.tree.set(selected_item, '#1'))
Значением для
 WHERE ID=?
выступает результат того что вернет метод set().
Согласно доков и если я правильно перевел
With two arguments, returns the current value of the specified column.
то получается данный метод возвращает текущее значение указанного столбца (если используем два аргумента, что в моём случае). И на этом месте у меня заканчивается понимание работы моего алгоритма. А именно, что возвращает в действительности метод .set() c указанными мною аргументами и что нужно получить
 WHERE ID =?
, чтоб он мог заменить выделенные в treeview значения.

Сразу извиняюсь, может где-то я просто теряю логику мышления… Прошу соберите мои кубики в нужном порядке….

Офлайн

#2 Янв. 31, 2019 06:28:37

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Функция редактирования значений БД

Из ttk.Treeview получение значения values из второй колонки, для выделенной строки, я делал так:

 try:
    item = self.tree.selection()[0]
except IndexError:
    showerror(title='Исправление кратности', message='Не выбрано наименование из списка')
    return
# Получим значение из второй колонки
vibran = self.tree.item(item, "values")[1]
# Далее обработка полученного
Для получения text надо указать, соответственно, text.
Если treeview настроен на выделение нескольких значений, то получение надо впихнуть в цикл и перебрать все
 for item in self.tree.selection():
    vibran = self.tree.item(item, "values")[1]

Офлайн

#3 Фев. 2, 2019 10:55:29

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция редактирования значений БД

Дело в то что вариант моей реализации работает корректно и как мне нужно, но я не могу до конца понять как это работает. В первом посту я указал, на каком моменте моё понимание закончилось.

Скрин программы

Прикреплённый файлы:
attachment Снимок.PNG (13,8 KБ)

Офлайн

#4 Фев. 4, 2019 11:33:26

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция редактирования значений БД


Верно ли я понимаю, что

  WHERE ID =?
должен на вход получить id строки которую необходимо изменить …
Помогите пожалуйста…

Офлайн

#5 Фев. 4, 2019 14:31:53

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Функция редактирования значений БД

Как бы странным не казалось, но tree.set(selected_item, ‘#1’) с этими двумя аргументами возвращает id строки. Если дополнительно дать аргумент value, то изменит значение в указанной колонке для строки с selected_item в отображаемом дереве, только на экране.

Feelgood
Верно ли я понимаю, что

WHERE ID =?

должен на вход получить id строки которую необходимо изменить …
Помогите пожалуйста…
Правильно понимаешь, если под изменяемым имеешь в виду значения в БД. В UPDATE со знаками вопроса вместо вопросов подставятся те значения, которые перечислены в кортеже после “UPDATE …”. Далее будет выполнен UPDATE, дополненный указанными в кортеже значениями.

Отредактировано Rafik (Фев. 4, 2019 14:35:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version