我正在使用 Zeoslib 使用 SQLite 创建内存数据库,并且我需要在程序关闭时将数据库保存到磁盘上或定期将其转储到文件中。
由于 SQLite3 程序无法在内存数据库中处理,有没有办法让 SQLite 将SELECT
查询的输出导出为 INSERT
语句?
PS。sqlite3
可以按照此线程中的指示将内存数据库转储到磁盘,但是内存数据库是由不同的应用程序创建的,这就是为什么我看不到如何使示例工作的原因。
我正在使用 Zeoslib 使用 SQLite 创建内存数据库,并且我需要在程序关闭时将数据库保存到磁盘上或定期将其转储到文件中。
由于 SQLite3 程序无法在内存数据库中处理,有没有办法让 SQLite 将SELECT
查询的输出导出为 INSERT
语句?
PS。sqlite3
可以按照此线程中的指示将内存数据库转储到磁盘,但是内存数据库是由不同的应用程序创建的,这就是为什么我看不到如何使示例工作的原因。
要将内存数据库保存到磁盘,请使用 SQLite 的备份 API创建一个副本。这要求您的数据库驱动程序实际上支持备份 API;Zeos显然没有。
使磁盘上的数据库如此缓慢的原因不是磁盘访问本身(大多数可以被缓存),而是同步以确保即使程序或计算机崩溃也能保持数据库完好无损。
有许多设置可以提高速度,但代价是使磁盘 DB 与内存 DB 一样不安全:
将PRAGMA 同步设置为OFF
:
使用同步 OFF (0),SQLite 在将数据移交给操作系统后继续进行而不进行同步。如果运行 SQLite 的应用程序崩溃,数据将是安全的,但如果操作系统崩溃或计算机在数据写入磁盘表面之前断电,则数据库可能会损坏。另一方面,同步关闭的提交可以快几个数量级。
将PRAGMA journal_mode设置为 MEMORY:
MEMORY 日志模式将回滚日志存储在易失性 RAM 中。这节省了磁盘 I/O,但以牺牲数据库安全性和完整性为代价。如果在设置 MEMORY 日志模式时使用 SQLite 的应用程序在事务中间崩溃,那么数据库文件很可能会损坏。
增加PRAGMA cache_size(默认通常只有 2 MB);