Вставка qt sqlite в таблицу автоинкремента дает две строки
Привет, у меня есть БД sqlite, которыми я манипулирую, используя qts встроенный драйвер базы данных sqlite.
У меня есть небольшое тестовое приложение, которое позволяет мне запускать sql-запрос из редактирования строки, и он будет выполнен, а затем результаты обновлены в представлении соответствующей модели.
Я создал таблицу, в которой используются автоинкрементные значения первичного ключа, но если я выполню инструкцию вставки без указания ключа, я получу две вставленные строки, каждая со значением автоинкрементации.
Если я предоставлю значение ключа, будет создана только одна строка. Есть идеи, почему это?
Таблица достаточно проста, например
CREATE TABLE GroupNames ( ID integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Name varchar(50))
и когда я запускаю запрос
insert into groupnames (name) values ("testName");
Я получаю две новые строки с автоинкрементными идентификаторами. Тем не менее, если я бегу
insert into groupnames (id, name) values (100, "testName");
Я получаю одну строку, как и ожидалось, с правильным идентификатором 100. Также стоит отметить, что если я попытаюсь
insert into table groupnames (id, name) values (100, "testName");
insert into table groupnames (name) values ("testName");
запрос не запускается. Код qt для выполнения запроса не может быть проще:
QSqlQuery *DbCore::run_query(const QString &query_string)
{
QSqlDatabase db = QSqlDatabase::database(defConnectionName);
if(!db.isOpen())
return NULL;
QSqlQuery *q = new QSqlQuery(query_string, db);
q->exec();
return q;
}
Я добавил код регистрации, чтобы проверить, что запрос выполняется один раз:
QSqlDatabase db = QSqlDatabase::database(defConnectionName);
if(!db.isOpen())
return NULL;
qDebug() << "Running query:" << query_string;
QSqlQuery *q = new QSqlQuery(query_string, db);
if(!q->exec())
qDebug() << "Error running query:" << q->lastError();
return q;
Журнал подтверждает, что я выполняю только один раз:
Running query: "insert into groupnames (name) values ("hello")"
Если я тогда проверю базу данных, используя оболочку sqlite3 (чтобы убрать любые сомнения относительно представлений qt и т. Д.):
sqlite> select * from groupnames;
1|hello
2|hello
1 ответ
Ответ на вопрос был дан выше в комментарии: Как я вижу из документации, когда вы создаете QSqlQuery так, как вы это делаете, выполняется запрос, если не пустой. Чтобы создать QSqlQuery и выполнить запрос, используйте это: QSqlQuery *q = new QSqlQuery(db); q->exec(query_string) Чтобы увидеть последний выполненный запрос, используйте QSqlQuery::lastQuery() И для последнего успешно выполненного запроса QSqlQuery:: executeQuery () Надеюсь, это поможет. - Гектор 16 марта в