【问题标题】:sqlite3: Table schema not copying from main database to second databasesqlite3:表模式未从主数据库复制到第二个数据库
【发布时间】:2020-08-15 14:26:43
【问题描述】:

我正在尝试将相同的表架构和选定数量的条目从我的主数据库复制到新的辅助数据库。我能够创建第二个数据库 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 database.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 START.sql 内

sqlite> .schema                                                                
CREATE TABLE copied(sql TEXT);   

【问题讨论】:

  • 对。 CREATE 查询创建一个包含 1 列的表;这个SELECT * from sqlite_master 选择 5 列,5 合 1 不会去。目前尚不清楚,至少对我而言,您正在寻找什么结果。
  • @DinoCoderSaurus 这是我的问题...我想要 masterDatabaseTest 架构的精确副本

标签: c++ sql database sqlite


【解决方案1】:

如果您想要“masterDatabaseTest 架构的精确副本”,则不需要使用sqlite_master。 DDL 查询

CREATE TABLE START.copied AS SELECT * from masterDatabaseTest

会做到这一点。如果您想要选择数量的条目,请添加 WHERE 子句。如果您不想要源表中的任何行,请添加WHERE 0;它将创建架构并且不会选择任何行。

【讨论】:

  • 试过了。它告诉我“没有 masterDatabaseTest 这样的数据库”,是的,它存在
  • 我不知道为什么它会给出“没有这样的数据库”错误,因为masterDatabaseTest 是一个表(基于 SELECT 查询和.schema 结果)。
【解决方案2】:

我发现了我的问题:)

db 实例未指向正确的数据库,因此虽然我能够在命令行中正确执行它,但实际程序没有初始化数据库连接,因此sqlite3_exec 命令没有指向任何内容。

修复我能够毫无问题地执行命令。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多