QSqlite изменения

Моя команда ранее использовала Qt 4.3 и пытается выполнить обновление до последней версии (4.7.2).

Раньше мы использовали плагин qsqlite, но эта функциональность была перемещена в основной компонент QSql Qt.

Теперь, когда мы обновились, мы не можем читать наши старые базы данных. Кажется, это потому, что когда мы создавали наши таблицы, мы создавали их так:

CREATE TABLE [Characters] ([Id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT UNIQUE ON CONFLICT ROLLBACK, [Project_Id] INTEGER NOT NULL ON CONFLICT ROLLBACK REFERENCES [Projects](Id) ON DELETE RESTRICT ON UPDATE RESTRICT ON INSERT RESTRICT, [CharacterName] VARCHAR(128) NOT NULL ON CONFLICT ROLLBACK UNIQUE ON CONFLICT ROLLBACK);

но ON INSERT RESTRICT больше не действует.

Я смог удалить этот код и создать новые таблицы, но если я сделаю myQSqlDatabase.tables() в одной из существующих баз данных, он вернет ноль.

Я заметил, копаясь в коде Qt, что метод подготовки имеет:

#if (SQLITE_VERSION_NUMBER >= 3003011)
    int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0);
#else
    int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0);
#endif

и мы входим в первое if (sqlite3_prepare16_v2).

Должны ли мы определять SQLITE_VERSION_NUMBER где-то ниже? Есть ли что-то еще, что мы делаем неправильно, чтобы предотвратить обратную совместимость?

Любая помощь будет оценена по достоинству.

Спасибо, Лирон


person Liron    schedule 22.03.2011    source источник


Ответы (1)


sqlite, загруженный с веб-сайта авторов, поставляется с программой командной строки. Если ваша база данных несовместима, вы можете легко использовать ее для экспорта данных в текстовый файл и загрузки в новую базу данных.

person Jay    schedule 22.03.2011
comment
Не совсем для нас вариант - приложение распределённое и копий базы много. Мы должны убедиться, что мы можем без проблем читать старую БД. - person Liron; 22.03.2011
comment
Я только что попробовал это в качестве теста: возьмите мою старую БД, прочитайте ее с помощью sqlite.exe и сделайте дамп в текстовый файл. Создайте новую БД из этого текстового файла. Затем выгрузите это как текстовый файл, и они эквивалентны (как и ожидалось). Кажется, проблема связана с самим кодом Qt, а не с кодом sqlite. - person Liron; 23.03.2011
comment
Выбранный ответ, потому что никто другой не прокомментировал. Проблема в коде Qt так и не была решена, но мы работали над ней. - person Liron; 01.08.2012