LINUX.ORG.RU

[Qt][PostgreSQL] QSqlRelationalTableModel и VIEW


0

1

Есть у меня такая табличка

CREATE TABLE marks
(
  id integer NOT NULL DEFAULT nextval('marks_id_seq'::regclass),
  workdate date NOT NULL,
  personpositionid integer NOT NULL,
  reasonid integer NOT NULL,
  hours numeric(4,2) NOT NULL,
  planmarkid integer,
  <тут всякие ключи>
)

В программе создаётся QSqlRelationalTableModel для редактирования таблицы, с одним отношением вида

setRelation(3, QSqlRelation("workers.reasons", "id", "name"))

Записи создаются, редактируются и удаляются на ура, всё замечательно.

Но понадобилась дополнительная функциональность со стороны базы данных, для чего исходная таблица была переименована в marks_table, и был создан VIEW вида

CREATE OR REPLACE VIEW marks AS 
 SELECT marks_table.id, marks_table.workdate, marks_table.personpositionid, marks_table.reasonid, marks_table.hours, marks_table.planmarkid
   FROM marks_table;

с правилами на INSERT, UPDATE и DELETE, которые замечательно работают при отправке запросов в базу напрямую. Но программа почему-то начала вести себя странно: отображение данных и добавление элемента через QSqlRelationalTableModel работают, а вот удаление и редактирование записи спотыкаются с такими ошибками:

SQL query error: "ERROR:  column "name" does not exist
LINE 1: ...D "workdate" = $2 AND "personpositionid" = $3 AND "name" = $...

и

SQL query error: "ERROR:  syntax error at or near "("
LINE 1: EXECUTE  (1504, '2011-02-07', 2574, 'Я - Продолжительность р...

Куда вообще копать? С точки зрения программы в базе данных должна быть всё та же прежняя таблица marks, я неоднократно пользовался таким приёмом, правда не использовал QSqlRelationalTableModel, только QSqlTabelModel, с которой не возникало никаких проблем при работе с view.

★★★★★

Ответ на: комментарий от guilder

> скорее всего в сырцы qsqlrelationtablemodel

угу, логично. Я копал, вот только там как-то через попу накодено. Скорее даже нужно смотреть QSqlTableModel, т.к. QSqlRelationalTableModel сам почти ничего и не делает на обновление и удаление. Но QSqlTableModel сам по себе нормально работает с вьюхами, так что непонятно к чему подступиться.

Вообще, в чем отличается view от table, что это может как-то задеть работу модели?

unC0Rr ★★★★★ ()

Сам с этим сталкивался. Решения так и не нашел

SAA ★★★ ()

Всё, осознал. В справке по QSqlRelationalTableModel чётко указано, что таблица должна иметь primary key. VIEW таковых не имеет и не может иметь.

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

Погуглил слегка, похоже, что решением могут стать materialized views. Пока читаю, что это такое и с чем едят. Если получится решить проблему, отпишусь.

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

В общем, для своей задачи обошёлся написанием правил для таблицы с небольшим костылём в виде дополнительной колонки.

unC0Rr ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.