python - 同时编辑一个sqlite表并输出它的一个元素
问题描述
我有一个要更新一行的 sqlite 表。我还想选择该行并将其元素发送到正在更新它的程序。
目前我正在通过两个单独的查询来做到这一点。
c.execute("""UPDATE Table1 SET Col1=(?)
WHERE Col2=(?) AND Col3=(?)
""", (var1, var2, var3,))
c.execute("""SELECT * from Table1
WHERE Col1=(?) AND Col2=(?) AND Col3=(?)
""",(var1, var2, var3,))
items = c.fetchall()
然而,这意味着 SQLite 必须在表中搜索两次,这要慢得多。是否可以使用单个查询更新然后选择行?
解决方案
SQLite 没有这样的功能(顺便说一下,MS SQL 有它的MERGE INTO
,但这在这里没有帮助)。
你正在做的是技术上要走的路。首先UPDATE
,然后SELECT
。
您是正确的,数据库引擎必须两次查找相关行。但这是一个预优化的例子。让 SQLite 两次查找相关行是一个问题吗?有时会,有时不会。这一切都取决于当前的情况。
如果这是一个问题,那么找到解决方案是合适的。在这种使用 Python 和 SQLite 的情况下,我认为没有可行的解决方案来避免数据库引擎两次查找相关行(同样,C# 中的实体框架可以执行一些技巧,例如在本地存储数据,以及再次,在这里没有帮助)。
在数据库中查找和写入行是数据库最擅长的。但是有一些方法可以提供帮助,因此数据库不必进行全表扫描来查找相关行。
引入索引:您只需告诉数据库您打算经常搜索哪些列,以保证它编译一个索引,其中哪些行具有该列的哪些值。在您的情况下,在 columns 上创建一个索引,并在and上创建Col1
一个组合列。您还可以考虑使用主键,它是每行的唯一值 - 有效地用作行的主查找值。Col2
Col3
推荐阅读
- flutter - 在颤振中使用“可拖动”时如何设置反馈和指针之间的偏移量?
- devops - AWS 中是否有任何服务可以为 AWS 中的 Ms SQL 服务器数据库执行 CI 流程
- windows - Windows 10 中的安装弹出窗口未显示 Android Studio 设置
- android - EditText 强制 textDirection 到 ltr 不起作用,有什么身体建议吗?
- c# - NLog - 它不会删除旧的日志文件
- javascript - 将函数传递给 navigationOptions 并检查它是否准备好?
- java - 如何以编程方式禁用 Windows 键?
- r - how to use string variable as filter condition in dplyr
- c++ - 传递给返回等待的函数的临时对象在使用 co_await 的暂停点后是否仍然有效
- javascript - 如何将记住我功能添加到 api 登录