首页 > 解决方案 > 同时编辑一个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 必须在表中搜索两次,这要慢得多。是否可以使用单个查询更新然后选择行?

标签: pythonsqlite

解决方案


SQLite 没有这样的功能(顺便说一下,MS SQL 有它的MERGE INTO,但这在这里没有帮助)。

你正在做的是技术上要走的路。首先UPDATE,然后SELECT

您是正确的,数据库引擎必须两次查找相关行。但这是一个预优化的例子。让 SQLite 两次查找相关行是一个问题吗?有时会,有时不会。这一切都取决于当前的情况。

如果这一个问题,那么找到解决方案是合适的。在这种使用 Python 和 SQLite 的情况下,我认为没有可行的解决方案来避免数据库引擎两次查找相关行(同样,C# 中的实体框架可以执行一些技巧,例如在本地存储数据,以及再次,在这里没有帮助)。

在数据库中查找和写入行是数据库最擅长的。但是有一些方法可以提供帮助,因此数据库不必进行全表扫描来查找相关行。

引入索引:您只需告诉数据库您打算经常搜索哪些列,以保证它编译一个索引,其中哪些行具有该列的哪些值。在您的情况下,在 columns 上创建一个索引,并在and上创建Col1一个组合列。您还可以考虑使用主键,它是每行的唯一值 - 有效地用作行的主查找值。Col2Col3

阅读例如https://www.sqlitetutorial.net/sqlite-index/


推荐阅读