数据库表不存在,但在尝试创建数据库表时以及之后

时间:2013-04-20 14:08:46

标签: sqlite qt

如果表还不存在,我正在尝试只初始化我的sqlite数据库。如果没有,则应创建它们。现在检查总是在干净的数据库上成功(当然表还不存在),但是一旦我尝试在if - 块中创建它,sqlite就会抱怨它确实存在。我可以在该代码运行后确认该表存在,但我仍然从qFatal调用中收到该错误消息。

#include <QApplication>
#include <QDebug>

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QStringList>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if(!db.open())
        qDebug() << "Couldn't open database file!";
    else
        qDebug() << "Opened database :memory:";

    qDebug() << "Existing tables:";
    QStringList::const_iterator it;
    for(it = db.tables().begin(); it != db.tables().end(); it++)
        qDebug() << it->toLocal8Bit().constData();
    qDebug() << "End";

    if(!db.tables().contains(QString("testtable")))
    {
        // The files table doesn't exist
        qDebug() << "Initializing DB";
        QString queryText = "CREATE TABLE testtable (id varchar(32) NOT NULL)";
        QSqlQuery query(queryText, db);
        if(!query.exec())
            qFatal("Couldn't initialize database: %s: %s", qPrintable(query.lastError().driverText()), qPrintable(query.lastError().databaseText()));
    }

    return a.exec();
}

参考输出:

Opened database :memory: 
Existing tables: 
End 
Initializing DB 
Couldn't initialize database: Unable to fetch row: table testtable already exists

我在sql查询中使用IF NOT EXISTS解决了这个问题,但这并不能解决问题。 (OS X上的Qt 4.8以及Ubuntu 12.04)

2 个答案:

答案 0 :(得分:0)

可能是我遗失了一些东西,但如果你正在使用&#34;:内存:&#34;为什么你需要这样的支票?存储。无论如何,在进程重启后,您的数据库将为空。

答案 1 :(得分:0)

我自己就注意到了这种行为。如果你查看source code,你会看到这一行:

int openMode = (openReadOnlyOption ? SQLITE_OPEN_READONLY : (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));

然后,进入SQLite's source

** ^(<dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
** <dd>The database is opened for reading and writing, and is created if
** it does not already exist. This is the behavior that is always used for
** sqlite3_open() and sqlite3_open16().</dd>)^

我没有进一步遵循它,但我认为可以安全地假设Qt正在传递这个标志。

这似乎是针对特定于驾驶员的行为,所以也许这就是为什么它not documented