#python #sql #firebird
#python #sql #firebird
Вопрос:
Я пытаюсь создать программу управления базами данных на Python и Tkinter, которая использует пользовательский ввод для ее обновления. Сценарий выглядит следующим образом:
- Пользователь выполняет поиск записей.
- Выбирает запись в виджете treeview.
- Выбор заполняет все поля ввода.
- Пользователь изменяет одно или несколько значений в них.
- Программа обновляет базу данных новыми значениями
Моя проблема заключается в следующем: Как мне сравнить старое значение (полученное при выборе в threeview) и новое значение (которое изменил пользователь)? У меня есть идея для цикла, который «сканирует» новые и старые значения и на основе этого выполняет запрос ОБНОВЛЕНИЯ для измененного столбца, но я не могу получить значение, которое находится в виджете ввода.
Ответ №1:
Это должен делать ваш виджет, а не база данных.
Что в любом случае вызовет запись базы данных? будет ли это какая-то кнопка «сохранить» в окне? Или это должно быть сделано сразу после переименования узла дерева (возможно, пользователь нажимает клавишу ENTER после ввода нового имени, но разные wdgets дерева могут иметь разные методы взаимодействия с пользователем).
Итак, последний вариант будет выглядеть следующим образом:
Когда пользователь начинает переименовывать узел, когда он переходит в режим редактирования узла дерева, виджет дерева уведомляет вас об этом, а затем вы считываете значение (до того, как пользователь изменил его) и сохраняете его в переменной. Затем вы ждете, пока пользователь прекратит редактирование узла.
Когда виджет дерева сообщает вам, что пользователь завершил редактирование, вы проверяете, какое это было завершение. Если это было завершение, подобное ОТМЕНЕ, то вы ничего не делаете.
Если это было нормально, как завершение, затем прочитайте теперь измененное имя узла в другую переменную.
Вы сравниваете две переменные, и если значения отличаются, вы указываете database на UPDATE
строку, соответствующую отредактированному узлу, а затем на COMMIT
транзакцию.
Как ранее сказал @MehdiKhlifi, в вашей таблице должен быть ID
столбец (читайте о SQL sequence
, в Firebird / Interbase это было создано generator
до того, как SQL стандартизировал его, это одно и то же). Вам нужно было бы каким-то образом сохранить эти идентификаторы в узлах дерева (прочитайте документацию вашего виджета, как это сделать), чтобы вы знали, какая строка таблицы соответствует только что отредактированному узлу.
В качестве альтернативы вы можете рассматривать все окно как фрейм данных, а не один узел.
Тогда вам нужно будет создать две функции:
- чтение дерева из некоторого буфера (массива, хэш-карты / словаря, объекта или чего-то еще)
- создание нового пустого буфера и запись в него дерева
Когда форма открыта, вы создаете один буфер и считываете его из базы данных, а затем считываете дерево из буфера.
Когда пользователь нажимает кнопку сохранения, вы записываете дерево в новый буфер, затем сравниваете эти два буфера, а затем для каждого измененного элемента выполняете SQL update
, как описано выше, затем вы выполняете SQL commit
для всех обновленных строк.
Обратите внимание, что обычно пользователь может делать больше, чем переименование определенных узлов: часто пользователь может добавлять новые узлы дерева, удалять узлы или перемещать узлы в другую ветку (обрезать и вставить).
Комментарии:
1. Спасибо вам за ответ. Я совсем новичок в python и такого рода работе. Что я сделал, так это следующее: когда пользователь нажимает кнопку «сохранить», он вызывает функцию, которая: во-первых, получает выбранные данные в строке treeview, во-вторых, устанавливает эти значения в списке. Оттуда я заставляю его сравнивать значения списка с новыми входными данными с помощью простых операторов if.
2. @T0ny1234 я абсолютный ноль в Python, это просто здравый смысл в создании приложения базы данных, независимо от языка и инструментария виджетов. Эти последние являются инструментарием, они влияют НА ТО, КАК вы можете реализовать цели, но цели остаются прежними. Я считаю, что должны быть книги или другой формат последовательности учебных пособий по созданию ориентированных на БД интерактивных приложений для настольных компьютеров на Python, попробуйте найти те, которые считаются лучшими. Даже если они будут использовать разные виджеты GUI или базу данных SQL — неважно, вы должны изучить общие концепции, детали и особенности появятся позже
Ответ №2:
Вам нужно позволить базе данных выполнять всю работу, то есть вы позволяете базе данных искать запись и обновлять ее на основе значения. Это значение должно быть уникальным, идентификатором.
Итак, что должно произойти:
- Пользователь выбирает запись и новое значение
- У вас есть идентификатор записи и новое значение
- Вызовите функцию обновления вашего ORM, которая должна принимать идентификатор записи и новое значение