sqlite3: схема таблицы не копируется из основной базы данных во вторую базу данных - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь скопировать ту же схему таблицы и выбрать количество записей из моей основной базы данных в новую вторичную базу данных. Я могу создать вторую базу данных 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);   

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я выяснил свою проблему:)

экземпляр db не указывал на правильную базу данных, поэтому, хотя я смог выполнить его правильно в командной строке, реальная программа не инициализировала базу данных соединение, поэтому команда sqlite3_exec ни на что не указывала.

Исправлено, что я смог выполнить команды без проблем.

0 голосов
/ 02 мая 2020

Если вы хотите " точную копию схемы masterDatabaseTest ", вам не нужно использовать sqlite_master. Запрос DDL

CREATE TABLE START.copied AS SELECT * from masterDatabaseTest

выполнит sh этого. Если вы хотите выбрать количество записей, добавьте предложение WHERE. Если вам не нужны строки из исходной таблицы, добавьте WHERE 0; он создаст схему и не выберет ни одной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...