Russian Qt Forum
Ноябрь 23, 2024, 18:05
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
Как писать программу для работы с БД без QSqlRelationalTableModel?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как писать программу для работы с БД без QSqlRelationalTableModel? (Прочитано 8083 раз)
Пытон
Гость
Как писать программу для работы с БД без 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! Она мне всю жизнь испортила!
(шутка, но с долей правды)
«
Последнее редактирование: Март 11, 2013, 17:52 от Пытон
»
Записан
Bepec
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #1 :
Март 11, 2013, 18:34 »
слишком эмоционально чтобы быть правдой )
Я бы склепал самопальный вариант минут за 40. На чистых запросах.
Элегантных решений не вижу.
Записан
Пытон
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #2 :
Март 12, 2013, 18:01 »
А я бы не склепал, потому и вопросы задаю, которые остаются без ответов...
Записан
Bepec
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #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;
Записан
Пытон
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #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
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #5 :
Март 13, 2013, 14:31 »
Ахз. Я всё больше убеждаюсь, что проще запросами работать. Ибо заготовки Qt для sql всё больше кажутся какими то... не рассчитанными на нормальную работу
Записан
Пытон
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #6 :
Март 14, 2013, 19:37 »
А я всё ещё жду и надеюсь узнать, к чему приделывать маппер-то? Разве он будет работать с QSqlQueryModel?
Записан
Bepec
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #7 :
Март 14, 2013, 19:40 »
а можно попробовать и узнать
Записан
Странник
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #8 :
Март 14, 2013, 22:25 »
предпочитаю QSqlRelationalModel не использовать - едва задача выходит за рамки стандартной примитивной, вы натыкаетесь на неизбежные ограничения. поскольку абсолютное большинство моих программ пишутся под конкретную СУБД, решаю проблему ее средствами:
1) на сервере создается представление (view), нужным образом объединяющее исходные таблицы
2) если данные необходимо редактировать посредством представления, на нем создаются соответствующие триггеры
3) в программе работаем с созданным представлением, используя QSqlTableModel и QWidgetMapper
Записан
Пытон
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #9 :
Март 17, 2013, 06:05 »
А можно хотя бы один пример ограничения?
Записан
Akon
Гость
Re: Как писать программу для работы с БД без QSqlRelationalTableModel?
«
Ответ #10 :
Март 22, 2013, 00:03 »
Перефразирую автора - "Как писать программы без всяких там SQL моделей". Переспективный вариант на сегодняшний день - ORM. Я как-то задавал здесь вопрос про опыт использования ORM, так вот, я попробовал (ORM ODB). В целом, понравилось. Конечно, если нужна какая-то сложная логика на сервере или сложные запросы, то опускаемя обратно до SQL. Но достоинств тоже куча. В моем (относительно несложном) случае использование ORM было оптимально.
Да, если вы дмаете в ООП стиле, то вас при работе с реляционными структурами всегда посещают мысли об улучшении кода в пламе инкапсуляции всей этой реляционной лапши в столь милое ООП обличие. Противоположное решение - делать все хранимыми процедурами на сервере. Но во многих случаях есть большой профит от того, что база данных редуцируется до простого хранилища, и тут без слоя объектов, инкапсулирующих данные (и сервисы) вам не обойтись.
А кьютовские модели по большому счету предназначены только для отображения данных.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...