Вставка 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 марта в

Другие вопросы по тегам