Russian Qt Forum
Ноябрь 23, 2024, 18:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как писать программу для работы с БД без QSqlRelationalTableModel?  (Прочитано 8084 раз)
Пытон
Гость
« : Март 11, 2013, 17:49 »

Поскольку эта свинина (QSqlRelationalTableModel) не желает показывать строки из БД в которых в ключевом поле хранится NULL, либо же значение не совпадающее ни с одним ключом из связанной таблицы, есть желание попробовать написать простенькую программку для работы с БД без свинины. Вдобавок, эта свинина не желает добавлять QSqlRecord в БД, пока не впихаешь вручную в эту record ключевые поля. Оне, отчего-то, не желают самостоятельно корректно создаваться в записи, которую ты создаёшь из этой же чёртовой свинины.

Ежели кому не лень, набросайте небольшой алгоритм. Имею ввиду - словами, а не кодом. Хотя, если у кого есть пример кода - не стесняйтесь, выкладывайте.

Допустим есть две таблицы: people (id, fio, id_gorod) и gorod (id_gorod, name). Связаны по полю id_gorod

Две формы, основная со списком людей, вторая с полями для редактирования данных выбранного человека (появляется при выборе нужного человека).

Что использовать для первой формы? QSqlQueryModel? Ведь мне нужно все цифры из поля id_gorod заменить на соответствующее поле name из таблицы gorod.

Затем, допустим по щелчку мыши на нужной записи, мне нужно открыть вторую форму с полями для редактирования этой записи. Тут мне чего использовать? QWidgetMapper не подойдёт. С чем мне его связывать? Придётся вручную запихивать все данные из SQL-запроса в контролы на форме? А потом вручную же их считывать и создавать новый SQL-запрос на изменение таблицы people?

А когда вторая форма будет закрыта и произойдёт возврат к первой форме, мне заново делать select для модели, дабы она отобразила изменения? А как заставить её выдать именно те строки среди которых должна оказаться и вновь изменённая запись?

П.С. Ненавижу QSqlRelationalTableModel! Она мне всю жизнь испортила!  Злой  (шутка, но с долей правды)

« Последнее редактирование: Март 11, 2013, 17:52 от Пытон » Записан
Bepec
Гость
« Ответ #1 : Март 11, 2013, 18:34 »

слишком эмоционально чтобы быть правдой )

Я бы склепал самопальный вариант минут за 40. На чистых запросах.

Элегантных решений не вижу.
Записан
Пытон
Гость
« Ответ #2 : Март 12, 2013, 18:01 »

А я бы не склепал, потому и вопросы задаю, которые остаются без ответов... Плачущий
Записан
Bepec
Гость
« Ответ #3 : Март 12, 2013, 19:38 »

Хм. Я жеж написал свой вариант решения (ручками и запросами).

У вас там мутная какая то ситуация с таблицами Веселый

И да, псевдокод, как просил:
Цитировать
SELECT p.id, p.fio, g.name,p.id_gorod FROM people p, gorod g WHERE p.id_gorod=g.id_gorod;
По идее этот запрос должен вернуть сформированную таблицу с необходимыми вам полями ид, фио, имя города, ид города. Скрываем колонку с ИД города при необходимости (я просто не уверен, что без этого поля запрос выполнится так, как я хочу. Тестить не на чем Подмигивающий )


Тыкаем на элемент, запоминаем положение курсора, открываем красивую формочку. В ней маппер + 1 поле с рукописным обработчиком. Редактируем. Маппер сохраняет, рукописный обработчик сохраняет.

Повторяем запрос, устанавливая курсор на предыдущую позицию.
SELECT p.id, p.fio, g.name,p.id_gorod FROM people p, gorod g WHERE p.id_gorod=g.id_gorod;

Записан
Пытон
Гость
« Ответ #4 : Март 13, 2013, 14:29 »

А итить твою ж в коромысло!!!
MyModel = QtSql.QSqlRelationalTableModel
MyModel.setJoinMode(QtSql.QSqlRelationalTableModel.LeftJoin)
или
MyModel.setJoinMode(0)что то же самое.
и свинина показывает строки с NULL в ключевых полях!!!

Доступно, начиная с Qt 4.8, с которой я, блин, и сижу...

Теперь осталось как-нибудь программно впиндюрить значение в ключевое поле в QSqlRecord, без нелогичного программного добавления в него ключевых полей, которые в нём и так ведь есть; и жизнь будет налаживаться.

П.С. А в псевдокоде маппер-то с чем связывается? Куда он сохраняет? В SqlQueryModel? Э-э-э... сие возможно?
« Последнее редактирование: Март 13, 2013, 14:34 от Пытон » Записан
Bepec
Гость
« Ответ #5 : Март 13, 2013, 14:31 »

Ахз. Я всё больше убеждаюсь, что проще запросами работать.  Ибо заготовки Qt для sql всё больше кажутся какими то... не рассчитанными на нормальную работу Улыбающийся
Записан
Пытон
Гость
« Ответ #6 : Март 14, 2013, 19:37 »

А я всё ещё жду и надеюсь узнать, к чему приделывать маппер-то? Разве он будет работать с QSqlQueryModel?
Записан
Bepec
Гость
« Ответ #7 : Март 14, 2013, 19:40 »

а можно попробовать и узнать Улыбающийся
Записан
Странник
Гость
« Ответ #8 : Март 14, 2013, 22:25 »

предпочитаю QSqlRelationalModel не использовать - едва задача выходит за рамки стандартной примитивной, вы натыкаетесь на неизбежные ограничения. поскольку абсолютное большинство моих программ пишутся под конкретную СУБД, решаю проблему ее средствами:
1) на сервере создается представление (view), нужным образом объединяющее исходные таблицы
2) если данные необходимо редактировать посредством представления, на нем создаются соответствующие триггеры
3) в программе работаем с созданным представлением, используя QSqlTableModel и QWidgetMapper
Записан
Пытон
Гость
« Ответ #9 : Март 17, 2013, 06:05 »

А можно хотя бы один пример ограничения?
Записан
Akon
Гость
« Ответ #10 : Март 22, 2013, 00:03 »

Перефразирую автора - "Как писать программы без всяких там SQL моделей". Переспективный вариант на сегодняшний день - ORM. Я как-то задавал здесь вопрос про опыт использования ORM, так вот, я попробовал (ORM ODB). В целом, понравилось. Конечно, если нужна какая-то сложная логика на сервере или сложные запросы, то опускаемя обратно до SQL. Но достоинств тоже куча. В моем (относительно несложном) случае использование ORM было оптимально.

Да, если вы дмаете в ООП стиле, то вас при работе с реляционными структурами всегда посещают мысли об улучшении кода в пламе инкапсуляции всей этой реляционной лапши в столь милое ООП обличие. Противоположное решение - делать все хранимыми процедурами на сервере. Но во многих случаях есть большой профит от того, что база данных редуцируется до простого хранилища, и тут без слоя объектов, инкапсулирующих данные (и сервисы) вам не обойтись.

А кьютовские модели по большому счету предназначены только для отображения данных.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 21.