Я пытаюсь понять, как получить 2D-данные из базы данных и вставить их в виджеты. Эти данные квазистатичны — как только я их получу, нет необходимости оставаться на связи с базой данных. Кроме того, если я оставлю соединение открытым, но время ожидания истечет, это может привести к сбою моего приложения. Я хотел бы знать, есть ли в QtSql какой-то автономный контейнер данных или функциональность, о которой я не знаю.
Насколько я понимаю, Qt предлагает только QsqlTableModel и QAbstractTableModel в качестве контейнеров для данных. Я не нашел никаких способов сохранения данных в QsqlTableModel при разрыве соединения. А QAbstractTableModel нельзя использовать сам по себе; вы должны подклассифицировать его. Вполне вероятно, что я в конечном итоге пойду по пути создания подклассов, если не смогу найти более простое или элегантное решение. Здесь есть пример подкласса.
В качестве примеров кода приведенный ниже код заполняет два поля со списком из базы данных SQL Server. При нажатии второй кнопки и заполнении второго поля со списком первое поле со списком прерывается, и приложение прерывается. Я надеюсь, что есть простой способ получить данные и сохранить их в локальном контейнере, отключенном от базы данных.
from PyQt5.QtWidgets import (QApplication, QMainWindow, QComboBox, QPushButton,
QTableView, QTableView)
from PyQt5.QtSql import (QSqlQuery, QSqlQueryModel, QSqlDatabase)
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__()
self.setGeometry(300, 300, 600, 350)
self.db = QSqlDatabase.addDatabase("QODBC", 'MyDB')
self.db.setDatabaseName('Driver={SQL Server};Server=MyServer;Database=MyDB;Trusted_Connection=Yes;')
self.cb1 = QComboBox(parent=self)
self.cb1.setGeometry(25,25, 250, 50)
self.cb2 = QComboBox(parent=self)
self.cb2.setGeometry(300,25, 250, 50)
self.button1 = QPushButton('^^^ Fill Table 1 ^^^', parent=self)
self.button1.setGeometry(55,290, 200, 30)
self.button1.clicked.connect(self.fillTable1)
self.button2 = QPushButton('^^^ Fill Table 2 ^^^', parent=self)
self.button2.setGeometry(320, 290, 200, 30)
self.button2.clicked.connect(self.fillTable2)
def fillTable1(self):
print('self.db.open() ', self.db.open())
sql = 'select * from aaa.car limit 10'
query = QSqlQuery(self.db)
print("query.exec_(sql) ", query.exec_(sql))
self.t1model = QSqlQueryModel(parent = self)
self.t1model.setQuery(query)
self.cb1.setModel(self.t1model)
self.cb1.setModelColumn(0)
self.cb1.setView(QTableView(self.cb1))
def fillTable2(self):
print('self.db.open() ', self.db.open())
sql = 'select * from aaa.car limit 10'
query = QSqlQuery(self.db)
print("query.exec_(sql) ", query.exec_(sql))
self.t2model = QSqlQueryModel(parent = self)
self.t2model.setQuery(query)
self.cb2.setModel(self.t2model)
self.cb2.setModelColumn(0)
self.cb2.setView(QTableView(self.cb2))
app = QApplication(sys.argv)
main = MainWindow(None)
main.show()
sys.exit(app.exec_())