我知道在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)
该.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)
几点说明:
我从头开始写它,没有测试它,所以它可能有一些错误,但你得到了一般的想法.
这不包括.dump
生成的其他查询,例如BEGIN;
,PRAGMA foreign_keys = 0;
在开头,然后COMMIT;
在结束时生成.
在.dump
可能产生在一些特殊情况下,我不知道一些更多的查询.我只是尝试.dump
在我的测试数据库上运行,其中包含2个表,这些都是我发现的结果.