根据用户输入更新数据库

2024-05-21 00:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python和Tkinter编写一个数据库管理程序,该程序依赖于用户输入来进行更新。脚本如下所示:

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

我的问题是:如何比较旧值(来自在threeview中选择的值)和新值(用户更改的值)? 我有一个循环的想法,它“扫描”新值和旧值,并根据这个循环在更改的列上执行更新查询,但我无法获得条目小部件中的值


Tags: 用户程序脚本数据库部件tkinter记录条目
2条回答

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

那么应该怎么办:

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

您的小部件应该这样做,而不是数据库

到底是什么触发了数据库写入?是窗口中的“保存”按钮吗?或者应该在重命名树的节点后立即执行此操作(可能,用户在键入新名称后按ENTER键,但不同的树WDGET可以有不同的用户交互方法)

因此,后一种选择是这样的:

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

当树小部件通知您用户已完成编辑时,您将检查完成的类型。如果它像完成一样被取消,那么你什么也不做

如果像完成一样正常,则将现在更改的节点名称读取到另一个变量

比较这两个变量,如果值不同,则命令database UPDATE与编辑的节点对应的行,然后命令database COMMIT与transaciton对应

正如@MehdiKhlifi之前所说的,您必须在表中有ID列(阅读关于SQLsequence,在Firebird/Interbase中,这是在SQL标准化之前作为generator创建的,这是同样的事情)。您必须以某种方式将这些ID存储到树节点中(阅读您的小部件文档,了解如何操作),以便知道哪个表行对应于刚刚编辑的节点


可选地,可以将整个窗口视为数据帧,而不是一个节点。

然后,您必须执行两个功能:

  • 从某个缓冲区(数组、哈希映射/字典、对象等)读取树
  • 创建新的空缓冲区并将树写入其中

当窗体打开时,您创建一个缓冲区并从数据库中读取它,然后从缓冲区中读取树

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


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

相关问题 更多 >