如何将 SQLite '.db' 数据库导出到 C++ 中的纯文本文件而不需要逐行迭代?

问题描述 投票:0回答:1

我正在 C++ 项目中使用 SQLite3 库,需要将“.db”SQLite 数据库的内容导出到纯文本文件中。但是,我想避免手动迭代每个表和行并将输出写入文件的常见方法。

我尝试过使用 sqlite3_backup_init()sqlite3_exec() 但找不到直接生成纯文本文件的方法。我遇到的大多数方法都涉及逐行复制,我想避免这种情况。

以下是我的主要要求:

  1. 将整个 SQLite 数据库导出为纯文本文件。
  2. 避免手动迭代表或行。
  3. 在 C++ 中使用 SQLite3 库。
  4. 解决方案不应涉及 MySQL 或任何其他外部工具。 有没有一种有效的方法可以使用 SQLite3 的内置功能或 C++ 库来实现此目的?
c++ database sqlite export
1个回答
0
投票

使用 C++ 包装器作为系统 shell:

这是一个可以跨平台运行的C++程序。它有两个参数:SQLite 数据库文件名和输出文件名。 C++ 程序使用 system() 函数调用 shell 脚本(Windows 批处理文件或非 Windows shell 脚本)。

#include <iostream>
#include <string>
#include <cstdlib>

#ifdef __unix__
  #define OS "UnixLinux"
#elif defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__CYGWIN__)
  #define OS "Windows"
#else
  #define OS "UnixLinux"
#endif

int main(int argc, char* argv[]) {
  if (argc != 3) {
    std::cerr << "Usage: " << argv[0] << " <db_file> <dump_file>" << std::endl;
    return EXIT_FAILURE;
  }

  std::string db_file = argv[1];
  std::string dump_file = argv[2];

  std::string command;
  if (OS == "Windows") {
    command = "dump_db.bat " + db_file + " " + dump_file;
  } else {
    command = "sh dump_db.sh " + db_file + " " + dump_file;
  }

  int status = system(command.c_str());

  if (status != 0) {
    std::cerr << "Error executing script: " << status << std::endl;
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

非 Windows shell 脚本 (dump_db.sh):

#!/bin/sh

sqlite3 "$1" ".dump" > "$2"

Windows 批处理文件(dump_db.bat):

@echo off
setlocal enabledelayedexpansion

set db_file=%1
set dump_file=%2

sqlite3.exe "%db_file%" ".dump" > "%dump_file%"

C++ 代码使用预处理器宏来检测操作系统。如果不需要跨平台的话可以避开。

P.S.:或者你可以修补https://github.com/BenKey/sqlite3pp,但 sqlite api 不提供对内部命令的访问,正如@Botje 已经告诉的那样。

© www.soinside.com 2019 - 2024. All rights reserved.