2014-12-04 98 views
2

正如问题所示。我使用":memory:"clsql:with-database创建了一个内存数据库,以提高写入/插入查询性能。但最后我确实希望在硬盘上拥有一个永久性的填充数据库副本。使用clsql将sqlite3内存数据库写入文件

它应该是这个样子:

(clsql:with-database (db (":memory:") :database-type :sqlite3) 
    ;;entering db-scheme 
    ;;entering a bunch of data 
    (magically-write-database-to-file db file-path)) 

我怎样才能做到这一点?

回答

4

如果你不关心数据的一致性在数据库创建完成之前,只使用一个正常的数据库文件,并将其配置为禁用transactionsdisk synchronization

(execute-command "PRAGMA journal_mode = OFF") 
(execute-command "PRAGMA synchronous = OFF") 
+0

是显著上升写入/插入速度。尽管如此,我还是很好奇。 – Sim 2014-12-04 10:47:28

+0

'synchronous'确保事务完成时数据已写入磁盘。该期刊需要回滚失败或中断的交易。如果没有这些,中断或中止任何数据库写入操作将导致数据库损坏。 – 2014-12-04 19:23:30

1

我认为你只需要用create-view-from-class创建表格,然后在你的对象上调用update-records-from-instance

不过我不确定明确的内存数据库的创建是否真的有意义。您可以先创建一个对象集合,然后一次将它们放入数据库update-records-from-instance。 CLSQL的“视图类”实际上只是普通的类,并提供了有关如何保存/加载它们的一些信息。当你只是在不保存的情况下改变对象时,没有什么魔法可以实现。