Как записать данные из таблицы PYQT в базу данных .db?
Мне требуется в кратчайшие сроки сделать задание, частью которого является сохранение данных из таблицы в базу данных. С базами данных я работаю первый день и у меня немного уже кипит голова, не могу разобраться...
import sys
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
import DataBaseChangingGUI as DataBaseChangingGUI # Это наш конвертированный файл дизайна
from PyQt5 import QtWidgets, QtCore
class ExampleApp(QtWidgets.QMainWindow, DataBaseChangingGUI.Ui_MainWindow):
def __init__(self):
# Это здесь нужно для доступа к переменным, методам
# и т.д. в файле design.py
super().__init__()
self.setupUi(self) # Это нужно для инициализации нашего дизайна
db = QSqlDatabase.addDatabase('QSQLITE') # Добавление базы данных
db.setDatabaseName('Rzhd.db') # Задаем имя БД
db.open()
# Инициализируем модель для работы с базой данных
self.model = QSqlTableModel(self)
self.model.setTable(db.tables()[0]) # Определение таблицы для выведения, функция для выведения всех таблиц - db.tables
self.tableView.setModel(self.model)
self.model.select()
# Выбор таблицы для вывода:
self.select_table.addItems(db.tables()) # Добавление элементов в комбобокс
self.select_table.currentTextChanged.connect(
self.update_current_table) # Реагирование на изменения в комбобоксе
# Выбор таблицы для фильтра:
columns = []
for i in range(self.model.record().count()):
columns.append(self.model.headerData(i, QtCore.Qt.Horizontal))
self.filter_col.addItems(columns)
# Обработка фильтров:
self.button_apply_filter.clicked.connect(self.apply_filter)
self.button_cancel_filter.clicked.connect(self.cancel_filter)
# Сортировка
self.tableView.setSortingEnabled(True)
# Добавление строки
self.add_row.clicked.connect(self.add_table_row)
# Удаление строки
self.del_row.clicked.connect(self.del_table_row)
def update_current_table(self):
self.model.setTable(self.select_table.currentText()) # Выбранная таблица - currentText()
self.filter_col.clear()
columns = []
# Создание списка с заголовками текущей таблицы
for i in range(self.model.record().count()):
columns.append(self.model.headerData(i, QtCore.Qt.Horizontal))
self.filter_col.addItems(columns)
self.model.select()
def apply_filter(self):
select_filter = self.filter_arg.displayText()
try:
select_filter = int(self.filter_arg.displayText())
self.model.setFilter(f"{self.filter_col.currentText()}={select_filter}") # работает как Where
except ValueError:
try:
symbol = select_filter[0]
select_filter = int(select_filter[1:])
if symbol == '=' or symbol == '<' or symbol == '>':
self.model.setFilter(f"{self.filter_col.currentText()} {symbol} {select_filter}")
else:
print('Возникла ошибка')
except ValueError:
self.model.setFilter(f"{self.filter_col.currentText()} LIKE '{self.filter_arg.displayText()}'")
except IndexError: # КОСТЫЛЬ НОМЕР 1 ЧТОБЫ ЕСЛИ ПОЛЬЗОВАТЕЛЬ НЕ ВВЕЛ НИЧЕГО В ФИЛЬТР ПРОГРАММА НЕ УМИРАЛА НАСМЕРТЬ
pass
def cancel_filter(self):
self.model.setFilter("")
def add_table_row(self):
self.tableView.model().insertRow(self.tableView.model().rowCount())
def del_table_row(self):
self.tableView.model().removeRow(self.tableView.selectionModel().currentIndex().row())
def main():
app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication
window = ExampleApp() # Создаём объект класса ExampleApp
window.show() # Показываем окно
app.exec_() # и запускаем приложение
if __name__ == '__main__': # Если мы запускаем файл напрямую, а не импортируем
main() # то запускаем функцию main()
Интерфейс:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1063, 780)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.filter_arg = QtWidgets.QLineEdit(self.centralwidget)
self.filter_arg.setFrame(True)
self.filter_arg.setObjectName("filter_arg")
self.gridLayout.addWidget(self.filter_arg, 1, 1, 1, 3)
self.tableView = QtWidgets.QTableView(self.centralwidget)
self.tableView.setObjectName("tableView")
self.gridLayout.addWidget(self.tableView, 2, 0, 1, 8)
self.filter_col = QtWidgets.QComboBox(self.centralwidget)
self.filter_col.setObjectName("filter_col")
self.gridLayout.addWidget(self.filter_col, 1, 5, 1, 1)
self.button_apply_filter = QtWidgets.QPushButton(self.centralwidget)
self.button_apply_filter.setObjectName("button_apply_filter")
self.gridLayout.addWidget(self.button_apply_filter, 1, 6, 1, 1)
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 4, 1, 1)
self.button_cancel_filter = QtWidgets.QPushButton(self.centralwidget)
self.button_cancel_filter.setObjectName("button_cancel_filter")
self.gridLayout.addWidget(self.button_cancel_filter, 1, 7, 1, 1)
self.button_apply_changes = QtWidgets.QPushButton(self.centralwidget)
self.button_apply_changes.setObjectName("button_apply_changes")
self.gridLayout.addWidget(self.button_apply_changes, 3, 7, 1, 1)
self.add_row = QtWidgets.QPushButton(self.centralwidget)
self.add_row.setObjectName("add_row")
self.gridLayout.addWidget(self.add_row, 3, 0, 1, 3)
self.del_row = QtWidgets.QPushButton(self.centralwidget)
self.del_row.setObjectName("del_row")
self.gridLayout.addWidget(self.del_row, 3, 3, 1, 2)
self.select_table = QtWidgets.QComboBox(self.centralwidget)
self.select_table.setObjectName("select_table")
self.gridLayout.addWidget(self.select_table, 0, 2, 1, 2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1063, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.select_table.currentTextChanged.connect(
self.update_current_table)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.button_apply_filter.setText(_translate("MainWindow", "Применить"))
self.label.setText(_translate("MainWindow", "Выберите таблицу"))
self.label_2.setText(_translate("MainWindow", "Фильтр"))
self.label_3.setText(_translate("MainWindow", "По полю"))
self.button_apply_changes.setText(_translate("MainWindow", "Принять изменения"))
self.button_cancel_filter.setText(_translate("MainWindow", "Отменить"))
self.add_row.setText(_translate("MainWindow", "Добавить строку"))
self.del_row.setText(_translate("MainWindow", "Удалить строку"))
Хочу либо добиться, чтобы данные сохранялись по кнопке