如何在不删除数据库文件的情况下完全清除SQLite3数据库?

Hub*_*bro 12 sql sqlite

出于单元测试的目的,我需要完全重置/清除 SQLite3 数据库。运行测试套件时,所有数据库都是在内存中创建的,而不是在文件系统上创建的,因此我无法删除任何文件。此外,一个类的多个实例将同时引用数据库,因此我不能只在内存中创建一个新数据库并将其分配给一个变量。

目前,我清除数据库的解决方法是读取所有表名sqlite_master并删除它们。但这与完全清除数据库不同,因为元数据和其他我不理解的东西可能会保留。

是否有一种干净简单的方法(例如单个查询)来清除 SQLite3 数据库?如果不是,必须对现有数据库执行什么操作才能使其与全新数据库相同?


如果相关的话,我将 Ruby 2.0.0 与sqlite3-ruby版本 1.3.7 和 SQLite3 版本 3.8.2 一起使用。

Ber*_*mos 11

这无需删除文件且无需关闭数据库连接即可工作:

PRAGMA writable_schema = 1;
DELETE FROM sqlite_master;
PRAGMA writable_schema = 0;
VACUUM;
PRAGMA integrity_check;
Run Code Online (Sandbox Code Playgroud)

如果可以直接调用 C API,另一种选择是使用SQLITE_DBCONFIG_RESET_DATABASE

PRAGMA writable_schema = 1;
DELETE FROM sqlite_master;
PRAGMA writable_schema = 0;
VACUUM;
PRAGMA integrity_check;
Run Code Online (Sandbox Code Playgroud)

这是参考