根据用户输入更新数据库

Update database based on user input

我正在尝试在 Python 和 Tkinter 中制作一个数据库管理程序,它依赖于用户输入来更新它。脚本是这样的:

  1. 用户搜索记录。
  2. 在树视图小部件中选择一个条目。
  3. 选择填充所有条目字段。
  4. 用户更改其中的一个或多个值。
  5. 程序使用新值更新数据库

我的问题是:如何比较旧值(来自三视图中的选择)和新值(用户更改)? 我有一个循环的想法,该循环 'scans' 新旧值并基于它在更改的列上执行 UPDATE 查询,但我无法获取 Entry 小部件中的值。

您需要让数据库完成工作,即让数据库搜索记录并根据值更新记录。这个值必须是唯一的,一个ID。

那么应该发生什么:

  1. 用户选择记录和新值
  2. 您有记录的 ID 和新值
  3. 调用你的 ORM 的更新函数,它应该接受记录的 ID 和新值

你的小部件应该做,而不是数据库。

到底什么会触发数据库写入?它会是 window 中的某个“保存”按钮吗?或者应该在树的节点重命名后立即完成(可能是用户在键入新名称后敲击 ENTER 键,但不同的树 wdgets 可以有不同的用户交互方法)。

所以,后一个选项是这样的:

当用户开始重命名节点时,当它进入树节点编辑模式时,树小部件会通知您,然后您读取值(在用户更改之前)并将其保存到变量中。然后等待用户停止编辑节点。

当树形小部件通知您用户完成了编辑时,您检查它是哪种完成。如果它是类似 CANCEL 的完成,那么你什么都不做。

如果完成类似 OK,则将现在更改的节点名称读取到另一个变量。

你比较两个变量,如果值不同,你命令数据库 UPDATE 与编辑节点对应的行,然后 COMMIT 事务。

正如@MehdiKhlifi 之前所说,您必须在 table 中包含 ID 列(阅读 SQL sequence,在 Firebird/Interbase 中在 SQL 标准化之前创建为 generator,这是一回事)。您将不得不以某种方式将这些 ID 存储到树节点中(阅读您的小部件文档如何操作),这样您就会知道哪个 table 行对应于刚刚编辑的节点。


或者,您可以将整个 window 视为数据框,而不是一个节点。

那你就得做两个函数:

  • 从某个缓冲区(数组、hashmap/dictionary、对象或其他东西)读取树
  • 创建新的空缓冲区并将树写入其中

打开表单时,您创建一个缓冲区并从数据库中读取它,然后玩具从缓冲区中读取树。

当用户按下保存按钮时,您将树写入新缓冲区,然后比较这两个缓冲区,然后对每个更改的项目执行如上所述的 SQL update,然后你对他更新的所有行执行 SQL commit


请注意,通常用户可以做的不仅仅是重命名特定节点:通常用户可以添加新的树节点、删除节点或将节点移动到不同的分支(修剪和粘贴)。