我正在 C++ 项目中使用 SQLite3 库,需要将“.db”SQLite 数据库的内容导出到纯文本文件中。但是,我想避免手动迭代每个表和行并将输出写入文件的常见方法。
我尝试过使用 sqlite3_backup_init() 和 sqlite3_exec() 但找不到直接生成纯文本文件的方法。我遇到的大多数方法都涉及逐行复制,我想避免这种情况。
以下是我的主要要求:
使用 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 已经告诉的那样。