Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ [РЕШЕНО] Почему QSqlTableModel не использует первичный ключ?

Автор: mva 15.3.2009, 20:00

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

Пытаюсь с помощью технологии "модель-представление" (классы 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

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


по идее первичный ключ должен использоваться, если он есть. См. http://www.doc.crossplatform.ru/qt/4.4.3/qsqltablemodel.html#setPrimaryKey

Автор: mva 15.3.2009, 20:43

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


по идее первичный ключ должен использоваться, если он есть. См. http://www.doc.crossplatform.ru/qt/4.4.3/qsqltablemodel.html#setPrimaryKey



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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)