gpt4 book ai didi

c++ - 使用 C++ 中的 prepare 语句在 SQLite 中批量插入数据

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:01 25 4
gpt4 key购买 nike

我有一个包含超过 100,000 条 JSON 记录的 std::vector。我需要快速将这些所有记录插入到 SQLite 数据库中。首先我尝试一个一个地插入到数据库中,但是需要1个多小时才能完成。

然后我搜索是否有任何方法可以使用 SQLite 一次插入批量数据(批处理数据)。但是缺乏它的来源。然后我尝试了以下代码。对于数据插入,我使用带有绑定(bind)参数的 sqlite3_prepare 语句。我需要扩展此方法以进行批量插入。

void insertSAData(vector<json> saData){
sqlite3_mutex_enter(sqlite3_db_mutex(db));
char* errorMessage;
sqlite3_exec(db, "PRAGMA synchronous=OFF", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA journal_mode=MEMORY", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA temp_store=MEMORY", NULL, NULL, &errorMessage);

sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

char const *szSQL = "INSERT INTO SA_DATA (DATA_ID,P_KEY,AMOUNT,AMOUNT_INDEX) VALUES (?,?,?,?);";
int rc = sqlite3_prepare(db, szSQL, -1, &stmt, &pzTest);

if( rc == SQLITE_OK ) {
for(int x=0;x<saData.size();x++){
// bind the value
sqlite3_bind_int(stmt, 1, saData[x].at("lastSAId"));
std::string hash = saData[x].at("public_key");
sqlite3_bind_text(stmt, 2, hash.c_str(), strlen(hash.c_str()), 0);
sqlite3_bind_int64(stmt, 3, saData[x].at("amount"));
string amount_index = saData[x].at("amount_idx");
sqlite3_bind_int(stmt, 4, atoi(amount_index.c_str()));

sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
}else{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}

sqlite3_mutex_leave(sqlite3_db_mutex(db));
}

但是这段代码不起作用。

或者还有其他方法可以完成我的任务吗?我需要更快地将所有 JSON 数据插入数据库。

最佳答案

这段代码解决了我的问题。

void insertSAData(vector<json> saData){
sqlite3_mutex_enter(sqlite3_db_mutex(db));
char* errorMessage;
sqlite3_exec(db, "PRAGMA synchronous=OFF", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA journal_mode=MEMORY", NULL, NULL, &errorMessage);
sqlite3_exec(db, "PRAGMA temp_store=MEMORY", NULL, NULL, &errorMessage);

sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

char const *szSQL = "INSERT INTO SA_DATA (DATA_ID,P_KEY,AMOUNT,AMOUNT_INDEX) VALUES (?,?,?,?);";
int rc = sqlite3_prepare(db, szSQL, -1, &stmt, &pzTest);

if( rc == SQLITE_OK ) {
for(int x=0;x<saData.size();x++){
// bind the value
sqlite3_bind_int(stmt, 1, saData[x].at("lastSAId"));
std::string hash = saData[x].at("public_key");
sqlite3_bind_text(stmt, 2, hash.c_str(), strlen(hash.c_str()), 0);
sqlite3_bind_int64(stmt, 3, saData[x].at("amount"));
string amount_index = saData[x].at("amount_idx");
sqlite3_bind_int(stmt, 4, atoi(amount_index.c_str()));

int retVal = sqlite3_step(stmt);
if (retVal != SQLITE_DONE)
{
printf("Commit Failed! %d\n", retVal);
}

sqlite3_reset(stmt);
}

sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
sqlite3_finalize(stmt);
}else{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}

sqlite3_mutex_leave(sqlite3_db_mutex(db));
}

关于c++ - 使用 C++ 中的 prepare 语句在 SQLite 中批量插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com