出于单元测试的目的,我需要完全重置/清除 SQLite3 数据库。运行测试套件时,所有数据库都是在内存中创建的,而不是在文件系统上创建的,因此我无法删除任何文件。此外,一个类的多个实例将同时引用数据库,因此我不能只在内存中创建一个新数据库并将其分配给一个变量。
目前我清除数据库的解决方法是读取所有表名sqlite_master
并丢弃它们。但这与完全清除数据库不同,因为元数据和其他我不理解的东西可能会保留。
是否有一种干净简单的方法(例如单个查询)来清除 SQLite3 数据库?如果不是,必须对现有数据库执行什么操作才能使其与全新数据库相同?
如果相关的话,我正在使用 Ruby 2.0.0sqlite3-ruby https://github.com/sparklemotion/sqlite3-ruby版本 1.3.7 和 SQLite3 版本 3.8.2。
这无需删除文件且无需关闭数据库连接即可工作:
PRAGMA writable_schema = 1;
DELETE FROM sqlite_master;
PRAGMA writable_schema = 0;
VACUUM;
PRAGMA integrity_check;
如果可以直接调用 C API,另一种选择是使用SQLITE_DBCONFIG_RESET_DATABASE
:
sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
sqlite3_exec(db, "VACUUM", 0, 0, 0);
sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
这里是参考 https://www.sqlite.org/c3ref/c_dbconfig_defensive.html#sqlitedbconfigresetdatabase
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)