Russian Qt Forum

Qt => Базы данных => Тема начата: Пытон от Март 11, 2013, 17:49



Название: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Пытон от Март 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! Она мне всю жизнь испортила!  >:(  (шутка, но с долей правды)



Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Bepec от Март 11, 2013, 18:34
слишком эмоционально чтобы быть правдой )

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

Элегантных решений не вижу.


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Пытон от Март 12, 2013, 18:01
А я бы не склепал, потому и вопросы задаю, которые остаются без ответов... :'(


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Bepec от Март 12, 2013, 19:38
Хм. Я жеж написал свой вариант решения (ручками и запросами).

У вас там мутная какая то ситуация с таблицами :D

И да, псевдокод, как просил:
Цитировать
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;



Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Пытон от Март 13, 2013, 14:29
А итить твою ж в коромысло!!!
MyModel = QtSql.QSqlRelationalTableModel
MyModel.setJoinMode(QtSql.QSqlRelationalTableModel.LeftJoin)
или
MyModel.setJoinMode(0)что то же самое.
и свинина показывает строки с NULL в ключевых полях!!!

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

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

П.С. А в псевдокоде маппер-то с чем связывается? Куда он сохраняет? В SqlQueryModel? Э-э-э... сие возможно?


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Bepec от Март 13, 2013, 14:31
Ахз. Я всё больше убеждаюсь, что проще запросами работать.  Ибо заготовки Qt для sql всё больше кажутся какими то... не рассчитанными на нормальную работу :)


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Пытон от Март 14, 2013, 19:37
А я всё ещё жду и надеюсь узнать, к чему приделывать маппер-то? Разве он будет работать с QSqlQueryModel?


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Bepec от Март 14, 2013, 19:40
а можно попробовать и узнать :)


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Странник от Март 14, 2013, 22:25
предпочитаю QSqlRelationalModel не использовать - едва задача выходит за рамки стандартной примитивной, вы натыкаетесь на неизбежные ограничения. поскольку абсолютное большинство моих программ пишутся под конкретную СУБД, решаю проблему ее средствами:
1) на сервере создается представление (view), нужным образом объединяющее исходные таблицы
2) если данные необходимо редактировать посредством представления, на нем создаются соответствующие триггеры
3) в программе работаем с созданным представлением, используя QSqlTableModel и QWidgetMapper


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Пытон от Март 17, 2013, 06:05
А можно хотя бы один пример ограничения?


Название: Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
Отправлено: Akon от Март 22, 2013, 00:03
Перефразирую автора - "Как писать программы без всяких там SQL моделей". Переспективный вариант на сегодняшний день - ORM. Я как-то задавал здесь вопрос про опыт использования ORM, так вот, я попробовал (ORM ODB). В целом, понравилось. Конечно, если нужна какая-то сложная логика на сервере или сложные запросы, то опускаемя обратно до SQL. Но достоинств тоже куча. В моем (относительно несложном) случае использование ORM было оптимально.

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

А кьютовские модели по большому счету предназначены только для отображения данных.