Я пытаюсь скопировать ту же схему таблицы и выбрать количество записей из моей основной базы данных в новую вторичную базу данных. Я могу создать вторую базу данных START.sql
и внутри нее таблицу с именем copied
, однако схемы между этой и основной masterDatabaseTest
отличаются, и в результате я получаю сообщение об ошибке:
table START.copied has 1 columns but 5 values were supplied
Код:
void newLog(std::string tableName, std::string timeStart, std::string timeEnd)
{
char *err_msg = NULL;
int rc= -1;
std::string dbLogName = timeStart;
std::string dbLogName2 = dbLogName + ".sql";
std::string attachQuery = "ATTACH DATABASE 'START.sql' AS 'START';";
std::string copyTable = "CREATE TABLE START.copied AS SELECT sql FROM sqlite_master WHERE type='table' and name='masterDatabaseTest';";
std::string insertCopied = "INSERT INTO START.copied SELECT * from sqlite_master where type='table' and name='masterDatabaseTest';";
std::string detach = "DETACH DATABASE START;";
std::cout << dbLogName << "\n"
<< attachQuery << "\n"
<< copyTable << "\n"
<< insertCopied << "\n"
<< detach << std::endl;
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, 0);
rc = sqlite3_open(databaseName.c_str(), &db); // CREATES DATABASE
std::cout << "OPEN: " << rc << std::endl;
rc = sqlite3_exec(db, attachQuery.c_str(), NULL, 0, &err_msg);
std::cout << "ATTACH: " << rc << std::endl;
if(rc != 0){
std::cout << err_msg << std::endl;
}
rc = sqlite3_exec(db, copyTable.c_str(), NULL, 0, &err_msg);
std::cout << "copyTable: " << rc << std::endl;
if(rc != 0){
std::cout << err_msg << std::endl;
}
rc = sqlite3_exec(db, insertCopied.c_str(), NULL, 0, &err_msg);
std::cout << "insertCopied: " << rc << std::endl;
if(rc != 0){
std::cout << err_msg << std::endl;
}
rc = sqlite3_exec(db, detach.c_str(), NULL, 0, &err_msg);
std::cout << "detach: " << rc << std::endl;
if(rc != 0){
std::cout << err_msg << std::endl;
}
sqlite3_exec(db, "END TRANSACTION;", NULL, NULL, 0);
}
внутри базы данных командной строки sqlite3. sql:
sqlite> .schema
CREATE TABLE masterDatabaseTest (ID INTEGER,RECORDTIME BIGINT,TYPE INTEGER,TIMESTAMP BIGINT,ENCODER1 INTEGER,ENCODER2 INTEGER,ENCODER3 INTEGER,ENCODER4 INTEGER,ENCODER5 INTEGER);
внутри командной строки sqlite3 СТАРТ. sql
sqlite> .schema
CREATE TABLE copied(sql TEXT);