PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
以SQLite数据库为例,学习数据库的基本操作,使用QSql模块查询、编辑数据并在前端展示。
SQLite数据库的基础知识:
https://blog.csdn.net/xulibo5828/category_12785993.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12785993&sharerefer=PC&sharesource=xulibo5828&sharefrom=from_link
QSql模块的基本操作:
QT的QSql 模块提供了对各种数据库的访问和操作功能,使得在 PySide 应用程序中与数据库进行交互变得相对简单。
基本概念
数据库连接(QSqlDatabase):
QSqlDatabase 类表示与数据库的连接。可以创建多个数据库连接,每个连接可以有不同的配置。
事务(Transactions):
QSqlDatabase 支持数据库事务,数据库事务将多个数据库操作组合在一起,比如对数据库进行插入、更新、删除等操作。如果这些操作全部成功,就可以提交,让这些操作永久生效;如果其中有任何一个操作失败,那么就全部回滚,即撤销所有已经执行的操作,让数据库恢复到事务开始之前的状态。这样可以保证数据库的一致性和完整性。
查询(QSqlQuery):
QSqlQuery 类用于执行 SQL 语句和查询数据。通过数据库连接创建 QSqlQuery 对象,并执行 SELECT、INSERT、UPDATE、DELETE 等 SQL 操作。
基本使用方法
- 导入模块:
from PySide6.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel, QSqlQueryModel
from PySide6.QtWidgets import QApplication, QTableView
- 创建数据库连接、注册数据库驱动:
db = QSqlDatabase.addDatabase('QSQLITE') # 使用 SQLite 数据库
db.setDatabaseName('example.db')
if not db.open():
print("无法打开数据库")
exit(1)
- 执行 SQL 查询:
不使用数据模型,创建 QSqlQuery 对象并执行 SQL 语句:
query = QSqlQuery()
query.exec_("CREATE TABLE IF NOT EXISTS persons (id INTEGER PRIMARY KEY, name VARCHAR(100), age INTEGER)")
query.exec_("INSERT INTO persons (name, age) VALUES ('张三', 30)")
query.exec_("INSERT INTO persons (name, age) VALUES ('李四', 25)")
-
使用数据模型:
创建 QSqlTableModel 并设置表:
model = QSqlTableModel()
model.setTable('persons')
model.select()
- 绑定到视图:
创建 QTableView 并设置模型:
app = QApplication([])
view = QTableView()
view.setModel(model)
view.show()
app.exec_()
事务处理
-
开始事务:
db.transaction()
-
提交事务:
db.commit()
-
回滚事务:
db.rollback()
示例代码
以下是一个完整的示例,展示了如何使用 PySide 的 QSql 模块创建数据库、插入数据,并将数据展示在 QTableView 中:
import sys
from PySide6.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PySide6.QtWidgets import QApplication, QTableView
def create_connection():
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('example.db')
if not db.open():
print("无法打开数据库")
return False
return True
def create_table():
query = QSqlQuery()
query.exec_("CREATE TABLE IF NOT EXISTS persons (id INTEGER PRIMARY KEY, name VARCHAR(100), age INTEGER)")
def insert_data():
query = QSqlQuery()
query.exec_("INSERT INTO persons (name, age) VALUES ('张三', 30)")
query.exec_("INSERT INTO persons (name, age) VALUES ('李四', 25)")
def main():
if not create_connection():
sys.exit(1)
create_table()
insert_data()
app = QApplication(sys.argv)
model = QSqlTableModel()
model.setTable('persons')
model.select()
view = QTableView()
view.setModel(model)
view.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
一些容易混淆的概念:
前端显示的QTableView 和 QTableWidget :
QTableView和QTableWidget的关系与区别-CSDN博客
QTableView:适用于需要高度灵活性、复杂数据管理或处理大数据集的场景。它要求开发者管理模型和视图的分离。
QTableWidget:适用于简单的表格需求,提供便捷的方法来操作表格数据,但灵活性和性能可能受限。
在实际的使用中,结合QSqlTableModel 和 QSqlQueryModel的话,QTableView的语句要更简洁一些。
数据模型的QSqlTableModel 和 QSqlQueryModel:
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用-CSDN博客
QSqlTableModel 和 QSqlQueryModel 是用于将数据库数据绑定到视图(如 QTableView)的模型类。QSqlTableModel 提供了编辑功能,而 QSqlQueryModel 通常用于只读数据展示。
查询类QSqlQuery和QSqlQueryModel的关系
QSqlQuery
是一个用于执行 SQL 语句,实现各种 SQL 操作的类。QSqlQueryModel
是一个数据模型类。QSqlQueryModel
内部使用 QSqlQuery
来执行 SQL 查询并获取数据。当为QSqlQueryModel
设置一个查询时,它会使用 QSqlQuery
来执行该查询,并将结果存储在模型中,以便视图可以显示这些数据。
PySide6(PyQT),QSqlQueryModel与QSqlQuery的关系-CSDN博客
使用QDataWidgetMapper的简单范例
QDataWidgetMapper是 Qt 框架中的一个类。它通常用于将数据模型中的数据映射到用户界面上的小部件(widgets)。例如,可以将数据库中的一条记录映射到一组输入框、下拉列表等界面元素上,方便用户查看和编辑数据。它提供了一种方便的方式来管理数据和界面之间的交互。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLineEdit, QPushButton, QDataWidgetMapper
from PySide6.QtSql import QSqlDatabase, QSqlTableModel
from PySide6.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 设置数据库
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("users.db")
if not db.open():
print("无法打开数据库")
return
# 创建模型
self.model = QSqlTableModel()
self.model.setTable("users")
self.model.select()
# 创建映射器
self.mapper = QDataWidgetMapper()
self.mapper.setModel(self.model)
# 创建控件
self.nameEdit = QLineEdit()
self.emailEdit = QLineEdit()
# 设置映射
self.mapper.addMapping(self.nameEdit, 1) # 假设姓名在第1列
self.mapper.addMapping(self.emailEdit, 2) # 假设邮箱在第2列
# 创建布局
layout = QVBoxLayout()
layout.addWidget(self.nameEdit)
layout.addWidget(self.emailEdit)
layout.addWidget(QPushButton("Next", clicked=self.onNext))
layout.addWidget(QPushButton("Previous", clicked=self.onPrevious))
# 创建中央部件
centralWidget = QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# 初始化映射器
self.mapper.toFirst()
def onNext(self):
if self.mapper.currentIndex() < self.model.rowCount() - 1:
self.mapper.toNext()
def onPrevious(self):
if self.mapper.currentIndex() > 0:
self.mapper.toPrevious()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())