crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> [РЕШЕНО] Почему QSqlTableModel не использует первичный ключ?
mva
  опции профиля:
сообщение 15.3.2009, 20:00
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Добрый день всем!

Пытаюсь с помощью технологии "модель-представление" (классы QSqlTableModel и QTableView) изменить запись на сервере PostgreSQL в некоторой таблице. В простейшем случае нужная мне запись изменяется. Но выяснилось, что изменения производятся через использование следующей конструкции, например:

PREPARE qpsqlpstmt_1 AS UPDATE "адрес" SET "ИМЯ"=$1 WHERE "КОД" = $2 AND "СТРАНА" = $3 AND "ГОРОД" = $4 AND "УЛИЦА" = $5 AND "ДОМ" = $6 AND "КВАРТИРА" = $7

Такая конструкция мне не нравится, т.к. она никак не использует первичный индекс КОД таблицы <адрес>. В результате поиск нужной записи в более-менее серьезной таблице будет происходить смертельно долго, т.к., во-первых, для поиска не используются индексы и, во-вторых, с увеличением количества полей увеличивается количество условий в секции WHERE. Я ожидал увидеть что-нибудь такое:

PREPARE qpsqlpstmt_1 AS UPDATE "адрес" SET "УЛИЦА"=$1 WHERE "КОД" = $2,

или еще проще:

UPDATE "адрес" SET "УЛИЦА"="ул.Советская" WHERE "КОД" = 153,

т.е. с подстановкой конкретных значений в комманду и без использование предварительно подготовленных функций.


Теперь вопрос: как заставить Qt использовать первичный индекс у моей таблицы и не посылать такие тупые комманды серверу? Использование класса QSqlIndex не дало результата, Qt снова посылает прежние комманды на сервер. Может кто даст ссылочку на толковую документацию по этому поводу? Я почему-то не могу найти...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.3.2009, 20:17
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mva @ 15.3.2009, 23:00) *
первичный индекс КОД таблицы <адрес>.
а это точно первичный ключ таблицы?
проверить можно так:
qDebug() << "PK=" << model->primaryKey();


по идее первичный ключ должен использоваться, если он есть. См. void QSqlTableModel::setPrimaryKey ( const QSqlIndex & key ) [protected]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 15.3.2009, 20:43
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.3.2009, 20:17) *
Цитата(mva @ 15.3.2009, 23:00) *
первичный индекс КОД таблицы <адрес>.
а это точно первичный ключ таблицы?
проверить можно так:
qDebug() << "PK=" << model->primaryKey();


по идее первичный ключ должен использоваться, если он есть. См. void QSqlTableModel::setPrimaryKey ( const QSqlIndex & key ) [protected]



Вопрос снимается. Действительно, я ступил сам. Это был не первичный ключ. Спасибо...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.6.2024, 14:17