【问题标题】:Saving to disk an in-memory database将内存数据库保存到磁盘
【发布时间】:2010-11-29 01:39:36
【问题描述】:

我通过 c++ 中的 sqlite 创建了一个数据库。

已经在内存中创建了数据库(使用文件名的“:memory:”参数),以便有一个非常快速的行为。

数据库由以下几行创建:

sqlite3* mem_database;
if((SQLITE_OK == sqlite3_open(":memory:", &mem_database)){
    // The db has been correctly created and
    // I can do some stuff with it.
}
sqlite3_close(mem_database);

我的问题是:如何将内存数据库写入磁盘? (当然是通过 c/c++)。

我阅读了一些关于 ATTACH 和 DETACH sqlite 命令的内容,但我只能让它们使用 sqlite 交互式 shell(而不是来自 c/c++ 代码)。

问候。

【问题讨论】:

    标签: c++ c database sqlite in-memory


    【解决方案1】:

    【讨论】:

    • 我正在寻找用于相同目的的 C# 文档。如果你知道,请分享。
    • @Mubashar:我不熟悉 C#。我相信在 C# 中转换示例很容易。 sqlite3_backup_X 函数可以完成这项工作。
    • 重定向到 url 是 stackoverflow 的错误答案。
    【解决方案2】:

    在对表执行任何操作之前使用事务语句。这也确保了快速处理和回滚。这样就不需要直接在内存中实现数据库了。

    【讨论】:

      【解决方案3】:

      如果您没有足够的时间阅读@NickDandoulakis 的答案发布的整个文档,只需将以下函数(已在链接中提及)复制并粘贴到您的代码中即可:

      int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave) 
      {
         int rc;                   /* Function return code */
         sqlite3 *pFile;           /* Database connection opened on zFilename */
         sqlite3_backup *pBackup;  /* Backup object used to copy data */
         sqlite3 *pTo;             /* Database to copy to (pFile or pInMemory) */
         sqlite3 *pFrom;           /* Database to copy from (pFile or pInMemory) */
      
         rc = sqlite3_open(zFilename, &pFile);
         if (rc == SQLITE_OK) 
         {
      
            pFrom = (isSave ? pInMemory : pFile);
            pTo = (isSave ? pFile : pInMemory);
      
            pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main");
            if (pBackup) {
               (void)sqlite3_backup_step(pBackup, -1);
               (void)sqlite3_backup_finish(pBackup);
            }
            rc = sqlite3_errcode(pTo);
         }
      
         (void)sqlite3_close(pFile);
         return rc;
      }
      

      然后将 SQLite db 的数据(在内存中)保存到文件调用中:

      loadOrSaveDb(db_con, target_file, 1);
      

      其中db_con 是您的数据库连接对象指针,target_file 是目标文件地址。

      备注:如果要将 SQLite 数据库文件加载到内存中,只需运行:

      loadOrSaveDb(db_con, target_file, 0);
      

      【讨论】:

        猜你喜欢
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 2018-08-03
        • 2011-12-27
        相关资源
        最近更新 更多