使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。
QtSql类时的数据库操作接口类,包含如下类:
QSql
QSqlError
QSqlQueryModel
QSqlRelationalTableModel
QSqlDatabase
QSqlField
QSqlRecord
QSqlResult
QSqlDriver
QSqlIndex
QSqlRelation
QSqlTableModel
QSqlDriverCreatorBase
QSqlQuery
QSqlRelationalDelegate
通过QSqlDataBase连接数据,sqlite是文件形式存储到本地,所以设置文件名 进行访问,当数据库不存在时会自动创建数据库。
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName(filePath)
直接调用open()方法打开数据,返回值是打开成功与否的标志。
if not self.db.open():
print("数据库连接失败!")
return False
else:
print("数据库连接成功!")
return True
通过QSqlQuery创建表,数据库打开后直接创建QSqlQuery对象即可,只添加一个数据库时为默认数据库,不需要指定数据库。
query = QSqlQuery()
query.exec(
'create table test(id int primary key unique, name varchar(15), notes varchar(50))')
self.db.close()
使用sql直接添加数据,需要注意sql语句中,字符类型需要添加双引号“”。
query.exec(
f'insert into test values({test.id},"{test.name}","{test.notes}")')
self.db.close()
使用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
添加一个简单的界面显示数据和基本操作
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)
# _*_ 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()))