【发布时间】:2014-07-30 02:38:25
【问题描述】:
我不知道如何最好地表达这个问题:
我想更新、添加或删除 SQLite3 表中的信息,但我不希望将这些数据写入磁盘。我仍然希望能够 选择数据,并获取更新的信息,但我想选择回滚或提交。
这可能吗? SELECT 会在 UPDATE 之前还是之后获取数据?还是必须在下一条语句之前回滚或提交?
【问题讨论】:
-
是的,你可以。选择数据不需要提交。你自己没试过吗?
我不知道如何最好地表达这个问题:
我想更新、添加或删除 SQLite3 表中的信息,但我不希望将这些数据写入磁盘。我仍然希望能够 选择数据,并获取更新的信息,但我想选择回滚或提交。
这可能吗? SELECT 会在 UPDATE 之前还是之后获取数据?还是必须在下一条语句之前回滚或提交?
【问题讨论】:
根据您的标签,我假设您使用的是 Python。这可能是特定数据库驱动程序的问题。尝试使用不使用 Python DB API 的数据库驱动程序,例如 apsw。另外,看看这个帖子:
【讨论】:
(披露:我是 apsw 的作者)。 SQLite(数据库而不是 python 包装器)完全支持你想要的,并且有多种方法可以实现它。
支持多个嵌套级别的事务。您可以使用savepoints,只有最外面的那个实际上会导致磁盘提交。相同的连接将看到未决的更改,但其他连接不会(称为isolation)。注意 pysqlite 不了解保存点,因此可能会非常困惑或无法正确地与它们进行互操作。 APSW 工作正常,您可以嵌套常规 with statements。
与该方法不同,您可以创建temporary tables,然后在满意时将数据复制到持久数据中。也可以附加或使用memory databases,类似的。
最后,如果您希望多个连接查看待处理数据,您可以将待处理数据存储在不同的数据库文件中,并将其附加到每个连接中,根据需要将数据复制到主数据库中。
【讨论】:
如果您明确需要在整个代码中多次提交,并且您担心事务的性能时间,您可以始终在内存中构建数据库db=sqlite3.connect(':memory:'),然后在所有时间关键时将其内容转储到磁盘该计划的各个方面已经完成。即脚本的结尾。
【讨论】: