Я использую Pyside6 и Sqlite. Для манипуляций с базой данных, таких как загрузка, удаление, сортировка, вставка и т. д., я использую QtSql и QSqlRelationalTableModel. Я не использую SQL-запросы SQL или QtSql, я полагаюсь на модель данных.
Спасибо!
WINDOW
Код: Выделить всё
# IMPORT PACKAGES AND MODULES
# ///////////////////////////////////////////////////////////////
import sys
import os
import datetime
# IMPORT DATABASE MODULES
# ///////////////////////////////////////////////////////////////
from test_database import DataBaseConnector as dbc
from PySide6 import QtSql
from ui_main import Ui_MainWindow
# IMPORT DELEGATE FOR CONVERTING DISPLAYED DATE
# ///////////////////////////////////////////////////////////////
from delegate import DateFormatDelegate, AlignDelegate
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from qt_core import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# SETUP MAIN WINDOw
# Load widgets from "gui\uis\main_window\ui_main.py"
# ///////////////////////////////////////////////////////////////
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.incomeViewSearch()
self.ui.pb_inc_del.clicked.connect(self.deleteIncome)
# MESSAGES
# ///////////////////////////////////////////////////////////////
def okayMessage(self, text):
QMessageBox.information(self, "Datensatz",
f"{text}")
def failMessage(self, text):
QMessageBox.critical(self, "Datensatzfehler", f"{text}")
# DATA LOAD FILTERED INCOME
# ///////////////////////////////////////////////////////////////
def incomeViewSearch(self):
# data model for income table
mod_income_search = None
# VARIABLES FOR THE FILTER SO NOT GET SOOOOO LONG :)
# CHECK IF THE FILTER TOGGLE IS CHECKED
start_date = "1752-09-14" # VERY FIRST DATE
end_date = "9999-12-31" # VERY LAST DATE
# RUN THE FILTER WITHOUT DATE SET FROM VERY PAST TO INFINITY
mod_income_search = dbc().incomeViewSearch(filter_begin=start_date, filter_end=end_date,)
mod_income_search.select()
self.ui.tbl_income.setModel(mod_income_search)
self.ui.tbl_income.setItemDelegateForColumn(1, DateFormatDelegate('dd.MM.yyyy'))
# self.ui.load_pages.tbl_income.setItemDelegateForColumn(2, AlignDelegate())
self.ui.tbl_income.setColumnHidden(0, True)
for i in range(mod_income_search.columnCount()):
# https://stackoverflow.com/questions/69912374/how-to-set-a-pyside6-qtablewidget-column-width-to-15pt
self.ui.tbl_income.horizontalHeader().setMinimumSectionSize(175)
self.ui.tbl_income.horizontalHeader().setSectionResizeMode(i, QHeaderView.ResizeToContents)
self.ui.tbl_income.horizontalHeader().setStretchLastSection(True)
# DELETE INCOME
# ///////////////////////////////////////////////////////////////
def deleteIncome(self):
rows = sorted(set(index.row() for index in
self.ui.tbl_income.selectedIndexes()))
print(rows)
for row in rows:
print(f'Row {row} is selected')
dbc().deleteIncome(row)
# SETTINGS WHEN TO START
# Set the initial class and also additional parameters of the "QApplication" class
# ///////////////////////////////////////////////////////////////
if __name__ == "__main__":
# APPLICATION
# ///////////////////////////////////////////////////////////////
app = QApplication(sys.argv)
window = MainWindow()
window.show()
# EXEC APP
# ///////////////////////////////////////////////////////////////
sys.exit(app.exec())
Код: Выделить всё
import os
import sys
import datetime
############### import ##################
from PySide6 import QtSql, QtCore
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBox
class DataBaseConnector:
# INIT
# //////////////////////////////////////////////////////////////
def __init__(self):
self.database = None
self.model = None
self.dbdriver = "QSQLITE"
self.dbname = "test_expense.db"
self.connect_db()
"""
connects to the database need two arguments database driver and database name
"""
# CONNECT DATABASE
# //////////////////////////////////////////////////////////////
def connect_db(self):
"""
:return: DB Connection
"""
if not os.path.isfile(self.dbname):
QMessageBox.critical(None, "Fehler", "Keine Datenbankverbindung!\n"
f"Bitte prüfen, ob die Datenbank {self.dbname} vorhanden ist.")
sys.exit()
else:
self.database = QtSql.QSqlDatabase.addDatabase(self.dbdriver)
self.database.setDatabaseName(self.dbname)
self.model = QtSql.QSqlRelationalTableModel()
# print(self.dbname)
return True
# CREATE INCOME MODEL
# //////////////////////////////////////////////////////////////
def incomeViewSearch(self, filter_begin="", filter_end=""):
"""
@param filter_begin:
@param filter_end:
@param filter_amount:
@param filter_category:
@param filter_note_txt:
@return:
"""
# data model for income table
self.model.setTable("income")
# if filter_begin:
# """
# This is an other way but it does not work
# """
"""
# This is working but no relations and delegates
self.mod_income_search.setQuery("SELECT * FROM income where inc_date >= '" + map + "' and inc_date
Подробнее здесь: [url]https://stackoverflow.com/questions/79218968/python-pyside6-qtableview-data-model-delete-record[/url]