如何使用QT转储SQLite DB的所有表?

use*_*091 0 sqlite qt

我知道在SQLite中有一个转储所有表(到文件"createDBTablesScript.sql")的功能:

sqlite> .output createDBTablesScript.sql
sqlite> .dump
sqlite> .quit
Run Code Online (Sandbox Code Playgroud)

有没有办法在QT中这样做?这样的东西(!这不工作!):

QString  queryString(".output createDBTablesScript.sql .dump");
QSqlQuery query( m_db );
bool checkQueryExcecution = query.exec( queryString );
Run Code Online (Sandbox Code Playgroud)

之后我也想从QT运行脚本,例如:

QString  createDBTablesScriptString("run createDBTablesScript.sql");
QSqlQuery query( m_db );
bool checkQueryExcecution = query.exec( createDBTablesScriptString );
Run Code Online (Sandbox Code Playgroud)

Goo*_*gie 7

.dump命令在sqlite命令行应用程序中实现,而不是在SQLite库本身中实现.在.dump使用标准的SQL查询来提取的一切,是从数据库需求.你也可以这样做,但它不仅仅是3行.

它会看起来像这样:

QSqlQuery query;
QStringList tables;
query.prepare("SELECT * FROM sqlite_master");
while (query.next())
{
    qDebug() << query.value("sql").toString();
    if (query.value("type").toString() == "table")
        tables << query.value("name");
}

static const QString insert = QStringLiteral("INSERT INTO %1 (%2) VALUES (%3);");
QStringList columns;
QStringList values;
QSqlRecord record;
bool first = true;
foreach (const QString& table, tables)
{
    first = true;
    query.prepare(QString("SELECT * FROM [%1]").arg(table));
    while (query.next())
    {
        record = query.record();
        for (int i = 0; i < record.count(); i++)
        {
            if (first)
                columns << record.fieldName(i);

            values << record.value(i);
        }
        first = false;

        qDebug() << insert.arg(table).arg(columns.join(", ")).arg(values.join(", "));
    }
}
Run Code Online (Sandbox Code Playgroud)

几点说明:

  1. 我从头开始写它,没有测试它,所以它可能有一些错误,但你得到了一般的想法.

  2. 这不包括.dump生成的其他查询,例如BEGIN;,PRAGMA foreign_keys = 0;在开头,然后COMMIT;在结束时生成.

  3. .dump可能产生在一些特殊情况下,我不知道一些更多的查询.我只是尝试.dump在我的测试数据库上运行,其中包含2个表,这些都是我发现的结果.