使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。
一、QtSql类
QtSql类时的数据库操作接口类,包含如下类:
QSql
QSqlError
QSqlQueryModel
QSqlRelationalTableModel
QSqlDatabase
QSqlField
QSqlRecord
QSqlResult
QSqlDriver
QSqlIndex
QSqlRelation
QSqlTableModel
QSqlDriverCreatorBase
QSqlQuery
QSqlRelationalDelegate
二、数据库操作
2.1 创建数据库
通过QSqlDataBase连接数据,sqlite是文件形式存储到本地,所以设置文件名 进行访问,当数据库不存在时会自动创建数据库。
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName(filePath)
2.2 打开数据库
直接调用open()方法打开数据,返回值是打开成功与否的标志。
if not self.db.open():
print("数据库连接失败!")
return False
else:
print("数据库连接成功!")
return True
2.3 创建表
通过QSqlQuery创建表,数据库打开后直接创建QSqlQuery对象即可,只添加一个数据库时为默认数据库,不需要指定数据库。
query = QSqlQuery()
query.exec(
'create table test(id int primary key unique, name varchar(15), notes varchar(50))')
self.db.close()
2.4 添加数据
使用sql直接添加数据,需要注意sql语句中,字符类型需要添加双引号“”。
query.exec(
f'insert into test values({test.id},"{test.name}","{test.notes}")')
self.db.close()
2.5 使用model查询
使用QSqlTableModel查询操作数据,直接设置对应的表名,即可快速操作。
model = QSqlTableModel()
model.setTable("test")
model.setEditStrategy(QSqlTableModel.EditStrategy.OnFieldChange)
model.select()
model.setHeaderData(0, Qt.Orientation.Horizontal, "ID")
model.setHeaderData(1, Qt.Orientation.Horizontal, "Name")
model.setHeaderData(2, Qt.Orientation.Horizontal, "Notes")
return model
三、界面显示
添加一个简单的界面显示数据和基本操作
3.1 view
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QTableView
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QGridLayout
from PyQt6.QtWidgets import QVBoxLayout
class MainWindowView(QMainWindow):
"""Main window view"""
def __init__(self) -> None:
super().__init__()
self.init_ui()
def init_ui(self):
"""Init ui"""
self.resize(600, 200)
self.mainwidget = QWidget()
self.setCentralWidget(self.mainwidget)
self.mainlayout = QGridLayout()
self.mainwidget.setLayout(self.mainlayout)
self.tv_main = QTableView()
self.mainlayout.addWidget(self.tv_main, 0, 0)
self.layout_edit = QVBoxLayout()
self.mainlayout.addLayout(self.layout_edit, 0, 1)
self.btn_add = QPushButton("Add")
self.btn_add.setObjectName("btn_add")
self.layout_edit.addWidget(self.btn_add)
self.btn_delete = QPushButton("Delete")
self.layout_edit.addWidget(self.btn_delete)
3.2 controller
# _*_ coding:utf-8 _*_
from PyQt6.QtCore import QObject
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QPushButton
from view.mainview import MainWindowView
from model.sqlitedb import SqliteDB
class MainWindowController(QObject):
"""The controller of main window."""
def __init__(self) -> None:
"""Init"""
super().__init__()
self.mainview = MainWindowView()
'''主窗体'''
self.btn_add = self.mainview.findChild(QPushButton, "btn_add", Qt.FindChildOption.FindChildrenRecursively)
"""添加一行按钮"""
self.btn_add.clicked.connect(self.addrow)
self.btn_delete = self.mainview.btn_delete
self.btn_delete.clicked.connect(lambda: self.model_testtable.removeRow(self.tv_main.currentIndex().row()))
self.tv_main = self.mainview.tv_main
'''主界面显示TableView'''
self.tv_main.clicked.connect(self.tableselectedchanged)
self.init_db()
self.model_testtable = self.testdb.query_testtable()
self.tv_main.setModel(self.model_testtable)
self.mainview.show()
def init_db(self):
"""Init database"""
self.testdb = SqliteDB()
dbpath = r".\zero.sqlite\db\test.db"
print(dbpath)
self.testdb.create_db(dbpath)
self.testdb.create_testtable()
def addrow(self):
"""添加一行"""
self.model_testtable.insertRow(self.model_testtable.rowCount())
def tableselectedchanged(self, item):
"""table selected"""
self.selecteitem = item
print("Selected Row:", str(self.selecteitem.row()))