Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 27

Требования к БД для { QlTableView + QSqlRelationalTableModel} - не сохраняются изменения

14.02.2025, 14:35. Показов 1550. Ответов 6

Студворк — интернет-сервис помощи студентам
после изменения модели с QSqlTableModel на QSqlRelationalTableModel
перестало происходить сохранение изменение в таблице

в основной таблице column 4 = 'dolgnost_id' bigint

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
model = QtSql.QSqlRelationalTableModel(None, db_con)
 
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
model.setTable(db_table) 
# связь с таблицей  id = bigint
model.setRelation(4, QtSql.QSqlRelation('spr_dolgnost', 'id', 'name'))
model.select()
 
model.dataChanged.connect(model.submitAll)
 
view = QTableView()
view.setModel(model)
 
# отключение/подключение делегата в принцитпе не влияет на сохранение
view.setItemDelegateForColumn(4, QtSql.QSqlRelationalDelegate(view))
поискал материалы на эту тему, основные сообщения о дополнительных требованиях к таблицам, связываемых через модель
QSqlRelationalTableModel
советов немного, все очень неоднозначные (в доке pySide6 больше пишут про всевдонимы)
вроде бы эта модель должна работа работать,
подскажите, пожалуйста, требования к таблицам, чтобы модель сохраняла изменения в базе ...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2025, 14:35
Ответы с готовыми решениями:

Qsqlrelationaltablemodel изменения не сохраняются в модель
Добрый день! Собственно вопрос в заголовке, код следующий, переделанный из примера: #include <QtWidgets> #include...

QSqlRelationalTableModel: изменения не записываются в БД
Доброго времени суток. После редактирования представления с моделью QSqlRelationalTableModel изменения не сохраняються в базу. В чем...

Не происходят изменения в БД при использовании модели QSqlRelationalTableModel
Здравствуйте! Возникла такая проблема: при выводе таблицы из БД в QTableView, используя модель QSqlTableModel, все прекрасно...

6
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
14.02.2025, 14:42
смотрите рабочий пример
https://it.kgsu.ru/Python_Qt/pyqt5_175.html
0
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 27
14.02.2025, 15:15  [ТС]
Спасибо, на основании именно этого примера я и сделал свой код редактора базы данных,
этот пример сделан на встроенном SQL-lite, у меня именно проблема с PSQL, который не хочет принимать данные из модели при наличии связей setRelation(),
нужно понять требования к связываемым таблицам, в которых будут сохраняться изменения в данных ..
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
15.02.2025, 14:48
насчет psql знаю только что не работает без primary key, у меня постгреса нет в доступности, проверить негде
если qsqltablemodel работает, то вопрос трудный - даже непонятно что и где искать
попробуйте трассировку сделать типа
Python
1
2
3
4
5
6
7
8
9
    
def on_submit():
    print(stm.submitAll())
    print('err',stm.lastError().text())
    
###
# 2-я вставка
stm.dataChanged.connect(on_submit)
# Конец 2-й вставки
Добавлено через 8 минут
еще вот подумал - отдельную кнопку сделать на submitAll
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
18.02.2025, 12:14
проблема меня заинтересовала, но я пришел к выводу, что такой функционал можно создать на основе QSqlTableModel без лишних наворотов
https://it.kgsu.ru/Python_Qt/pyqt5_175.html
применительно к этому примеру
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import (QApplication, QTableView, QComboBox, QItemDelegate,QMessageBox)
from PyQt5.QtSql import QSqlTableModel, QSqlDatabase, QSqlQuery
 
class ComboBoxDelegate(QItemDelegate):
    def __init__(self, parent=None, keys=[], values=[]):
        super().__init__(parent)
        self.keys = keys
        self.values = values
        
    def createEditor(self, parent, option, index):
        self.parent = parent
        editor = QComboBox(parent)
        return editor
 
    def setEditorData(self,editor,index):
        key = index.data()
        try: idx = self.keys.index(key)
        except: idx = 0
        editor.addItems(self.values)
        editor.setCurrentIndex(idx)
 
    def setModelData(self, editor, model, index):
        value  =  editor.currentText()
        try: idx = self.values.index(value)
        except: idx = 0
        model.setData(index, self.keys[idx])
        self.closeEditor.emit(editor)
        
    def paint(self,painter,option,index):
        key = index.data()
        try: idx = self.keys.index(key)
        except: idx = 0
        option.font.setItalic(True)
        self.drawDisplay(painter,option,option.rect,self.values[idx])
 
class View(QTableView):
    def __init__(self):
        super().__init__()
        self.dbname = ''
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        model = QSqlTableModel()
        self.horizontalHeader().setSectionResizeMode(1)
        self.setModel(model)
        
        self.open_db('data.sqlite')
        model.setTable('good')
        model.select()
        model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.hideColumn(0)
        headers = ['Наименование','Количество','Категория']
        for i in (1,2,3): model.setHeaderData(i, Qt.Horizontal, headers[i-1])
 
        q = QSqlQuery('select id,catname from category')
        keys,values = [],[]
        while q.next():
            keys.append(q.value(0))
            values.append(q.value(1))
        self.setItemDelegateForColumn(3,ComboBoxDelegate(self,keys,values))
        
    def open_db(self,dbname):
        if self.db.isOpen(): 
            self.db.close()
        self.dbname = dbname
        self.db.setDatabaseName(dbname)
        if not(self.db.open()):
            QMessageBox.critical(self,"",self.db.lastError().text())
            return
        self.setWindowTitle(dbname)
 
if __name__ == '__main__':
    app = QApplication([])
    w = View()
    w.setFont(QFont('times',18))
    w.resize(600,400)
    w.show()
    app.exec()
1
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 27
18.02.2025, 12:33  [ТС]
Спасибо! Сейчас попробую ...
проблемы с mvc для PSQL + PySide начались еще с авто increment id, которое не работает при добавлении записей через модель, для SQL-lite, на котором сделаны при учебные примеры, все работает ...
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
18.02.2025, 15:57
Лучший ответ Сообщение было отмечено xkein как решение

Решение

Цитата Сообщение от xkein Посмотреть сообщение
авто increment id
у постгрес нет autoincrement, используйте serial

Добавлено через 2 минуты
https://metanit.com/sql/postgresql/2.2.php
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2025, 15:57
Помогаю со студенческими работами здесь

Есть скрипт, позволяющий вносить изменения в html таблицу. Однако изменения не сохраняются после обновления страницы
Вот сама страница(нужно сделать так, чтобы изменения сохранялись и отображались после обновления страницы): <style> td { ...

Не сохраняются изменения
try { OleDbConnection connect = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\rregistry.mdb"); ...

Не сохраняются изменения
Здравствуйте. Помогите пожалуйста. При попытке сохранить любое изменение в панели управления Джумлы, вылезает вот такая строка: Fatal...

Не сохраняются изменения в БД
Создал две формы. В Form1 добавил DataGridView для отображения данных моей базы Phones.mdb. В форме есть 4 кнопки. Работает, хоть и криво,...

Не сохраняются изменения в БД
У меня есть БД с учениками (ID_ученика, Успеваемость, ФИО, Класс). на форме у меня есть текстовое поле "yspev". И в зависимости...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru