PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。

一、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()))

猜你喜欢

转载自blog.csdn.net/u010839204/article/details/131177294
今日推荐