如何进行PyQt5数据库操作

技术如何进行PyQt5数据库操作如何进行PyQt5数据库操作,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PyQt5数据库操作一、SQLite数据库1、

如何操作PyQt5数据库,针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的朋友找到更简单更容易的方法。

00-101010

PyQt5数据库操作

一、SQLite数据库

1、SQLite简介

SQLite是一个轻量级的数据库,它实现了一个自给自足、无服务器、零配置、事务性的SQL数据库引擎,主要用作手机应用和小型桌面应用的数据库。

官方网站:

https://www.sqlite.org

00-1010,创建一个数据库文件,然后进入SQLite命令行模式。sqlite3 DatabaseName.db

检查现有的数据库文件,并以SQLite命令行模式执行它:数据库。

打开现有的数据库文件,如果它不存在,则创建它。sqlite3 DatabaseName.db

检查帮助信息,并在SQLite命令行模式下执行它:帮助

创建一个表,在SQLite命令行模式下执行:创建表人(ID整数主键,名称文本);

将数据插入到表中:插入到人员(ID,姓名)值(1,‘张三’);

操作:从人员中选择*;

查询的结构:架构人员

2、SQLite常用操作

SQLite有几个开源的优秀的DBMS (Database Management System),提供了操作SQLite数据库的接口。

SQLiteStudio是一款非常专业的SQLite数据库管理软件,体积小巧,功能强大,支持中文,无需安装。

SQLiteStudio下载:

https://sqlitestudio.pl/index.rvt?act=下载

00-1010

3、SQLite管理工具

pyqt,QSqlDatabase类用于连接数据库,可以通过使用数据库驱动程序与不同的数据库进行交互。一个QSqlDatabase实例代表一个数据库连接。可用的数据库驱动程序类型如下:

QDB2 IBM DB2驱动程序

QMYSQL MySQL驱动程序

甲骨文呼叫接口驱动程序

QODBC ODBC驱动程序(包括MS SQL Server)

QPSQL PostgreSQL驱动程序

SQLite SQLite 3驱动程序

QSQLITE2 SQLite2驱动程序

二、连接数据库

QSqlDatabase常用的方法如下:

AddDataBase:设置连接数据库的数据库驱动类型。

SetDatabaseName:设置连接的数据库的名称。

SetHostName:设置数据库所在主机的名称。

SetUserName:指定连接的用户名。

SetPassword:设置连接对象的密码。

提交:提交事务,如果执行成功,返回真。

回滚:回滚数据库事务。

关闭:关闭数据库连接

1、数据库驱动类型

importsys

从PyQt5开始。QtSqlimportQSqlDatabase

从PyQt5开始。QtCoreimport*

if__name__=='__main__':

app=QCoreApplication(sys.argv)

db=qsqldatabase . adddatabase(' QSQLITE ')

db . setdatabasename('/home/user/test . db ')

ifdb.open():

打印(' openDBsuccess.quot

;)
    sys.exit(app.exec_())

三、执行SQL语句

QSqlQuery具有执行和操作SQL语句的功能,可以执行DDL和DML类型的SQL查询,QSqlQuery.exec_()用于执行SQL操作。

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
from PyQt5.QtCore import *
def createDB():
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("/home/user/test.db")
    if db.open():
        query = QSqlQuery()
        query.exec_("create table person(id int primary key, name varchar(20), address varchar(30))")
        query.exec_("insert into person values(1, 'Bauer', 'beijing')")
        query.exec_("insert into person values(2, 'Jack', 'shanghai')")
        query.exec_("insert into person values(3, 'Alex', 'chengdu')")
        db.close()
if __name__ == "__main__":
    app = QCoreApplication(sys.argv)
    createDB()
    sys.exit(app.exec_())

执行完SQL语句后,如果没有其它数据库操作,需要使用db.close关闭数据库连接,因为数据库连接资源是有限的,不再使用的数据库连接必须关闭,否则数据库连接资源最终会被耗尽,导致程序无法正常连接数据库。
如果在PyQt的窗口中需要读取数据库的数据并进行显示,则需要在窗口初始化时打开数据库,在窗口关闭时关闭数据库连接。

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("/home/user/test.db")
        self.db.open()
    def closeEvent(self, event):
        self.db.close()
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

四、数据库模型视图

Qt中的QSqlTableModel是一个高级接口,提供了可读可写的数据模型,用于在单个表中读取和保存数据,可以在QTableView展示数据库的表格。当连接到数据库后,使用seTable设置要查询的表,使用setFilter函数设置过滤器条件,然后使用select函数进行查询操作。可以使用setEditerStrategy函数设置编辑策略,可设置编辑策略如下:
QSqlTableModel.OnFieldChange:所有变更实时更新到数据库
QSqlTableModel.OnRowChange:当用户选择不同的行时,在当前行进行更新
QSqlTableModel.OnManuallSubmit:手动提交,不自动提交

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("/home/user/test.db")
        self.db.open()
        self.model = QSqlTableModel()
        self.initializedModel()
        self.tableView = QTableView()
        self.tableView.setModel(self.model)
        self.layout = QVBoxLayout()
        addButton = QPushButton("add")
        deleteButton = QPushButton("delete")
        hLayout = QHBoxLayout()
        hLayout.addWidget(addButton)
        hLayout.addWidget(deleteButton)
        self.layout.addWidget(self.tableView)
        self.layout.addLayout(hLayout)
        self.setLayout(self.layout)
        self.resize(600, 400)
        addButton.clicked.connect(self.onAddRow)
        deleteButton.clicked.connect(self.onDeleteRow)
    def initializedModel(self):
        self.model.setTable("person")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.select()
        self.model.setHeaderData(0, Qt.Horizontal, "ID")
        self.model.setHeaderData(1, Qt.Horizontal, "Name")
        self.model.setHeaderData(2, Qt.Horizontal, "Address")
    def onAddRow(self):
        self.model.insertRows(self.model.rowCount(), 1)
        self.model.submit()
    def onDeleteRow(self):
        self.model.removeRow(self.tableView.currentIndex().row())
        self.model.submit()
        self.model.select()
    def closeEvent(self, event):
        self.db.close()
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

五、分页查询

1、数据准备

分页使用数据为学生信息student表,可以使用SQLite命令行使用SQL语句插入,也可以使用Python程序创建表并插入数据。

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("/home/user/test.db")
if not db.open():
    return False
query = QSqlQuery()
query.exec_("create table student(id int primary key, name varchar(20), sex varchar(8), age int);")
query.exec_("insert into student values(1, 'Bauer', 'Man', 25)")
query.exec_("insert into student values(2, 'Alex', 'Man', 24)")
query.exec_("insert into student values(3, 'Mary', 'Female', 23)")
query.exec_("insert into student values(4, 'Jack', 'Man', 25)")
query.exec_("insert into student values(5, 'xiaoming', 'Man', 24)")
query.exec_("insert into student values(6, 'xiaohong', 'Female', 23)")
query.exec_("insert into student values(7, 'xiaowang', 'Man', 25)")
query.exec_("insert into student values(8, 'xiaozhang', 'Man', 25)")
query.exec_("insert into student values(9, 'xiaoli', 'Man', 25)")
query.exec_("insert into student values(10, 'xiaohan', 'Man', 25)")

2、分页窗口

分页窗口包括标签、前一页、后一页、跳转按钮等。

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel, QSqlQueryModel
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DataGrid(QWidget):
    def __init__(self, parent=None):
        super(DataGrid, self).__init__(parent)
        # 数据库连接
        self.db = None
        # 布局管理器
        self.layout = QVBoxLayout()
        # 查询模型
        self.queryModel = QSqlQueryModel()
        # 表格视图
        self.tableView = QTableView()
        self.tableView.setModel(self.queryModel)
        #
        self.totalPageLabel = QLabel()
        self.currentPageLabel = QLabel()
        self.switchPageLineEdit = QLineEdit()
        self.prevButton = QPushButton("Prev")
        self.nextButton = QPushButton("Next")
        self.switchPageButton = QPushButton("Switch")
        self.currentPage = 0
        self.totalPage = 0
        self.totalRecordCount = 0
        self.pageRecordCount = 5
    def initUI(self):
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.layout.addWidget(self.tableView)
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.prevButton)
        hLayout.addWidget(self.nextButton)
        hLayout.addWidget(QLabel("跳转到"))
        self.switchPageLineEdit.setFixedWidth(40)
        hLayout.addWidget(self.switchPageLineEdit)
        hLayout.addWidget(QLabel("页"))
        hLayout.addWidget(self.switchPageButton)
        hLayout.addWidget(QLabel("当前页:"))
        hLayout.addWidget(self.currentPageLabel)
        hLayout.addWidget(QLabel("总页数:"))
        hLayout.addWidget(self.totalPageLabel)
        hLayout.addStretch(1)
        self.layout.addLayout(hLayout)
        self.setLayout(self.layout)
        self.setWindowTitle("DataGrid")
        self.resize(600, 300)
    def closeEvent(self, event):
        self.db.close()
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DataGrid()
    window.initUI()
    window.show()
    sys.exit(app.exec_())

如何进行PyQt5数据库操作

3、分页查询实现

读取数据库的student表,初始化表格数据模型。

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel, QSqlQueryModel
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import re
class DataGrid(QWidget):
    def __init__(self, parent=None):
        super(DataGrid, self).__init__(parent)
        # 声明数据库连接
        self.db = None
        # 布局管理器
        self.layout = QVBoxLayout()
        # 查询模型
        self.queryModel = QSqlQueryModel()
        # 表格视图
        self.tableView = QTableView()
        self.tableView.setModel(self.queryModel)
        #
        self.totalPageLabel = QLabel()
        self.currentPageLabel = QLabel()
        self.switchPageLineEdit = QLineEdit()
        self.prevButton = QPushButton("Prev")
        self.nextButton = QPushButton("Next")
        self.switchPageButton = QPushButton("Switch")
        # 当前页
        self.currentPage = 1
        # 总页数
        self.totalPage = None
        # 总记录数
        self.totalRecordCount = None
        # 每页记录数
        self.pageRecordCount = 4
        self.initUI()
        self.initializedModel()
        self.setUpConnect()
        self.updateStatus()
    def initUI(self):
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.layout.addWidget(self.tableView)
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.prevButton)
        hLayout.addWidget(self.nextButton)
        hLayout.addWidget(QLabel("跳转到"))
        self.switchPageLineEdit.setFixedWidth(40)
        hLayout.addWidget(self.switchPageLineEdit)
        hLayout.addWidget(QLabel("页"))
        hLayout.addWidget(self.switchPageButton)
        hLayout.addWidget(QLabel("当前页:"))
        hLayout.addWidget(self.currentPageLabel)
        hLayout.addWidget(QLabel("总页数:"))
        hLayout.addWidget(self.totalPageLabel)
        hLayout.addStretch(1)
        self.layout.addLayout(hLayout)
        self.setLayout(self.layout)
        self.setWindowTitle("DataGrid")
        self.resize(600, 300)
    def setUpConnect(self):
        self.prevButton.clicked.connect(self.onPrevPage)
        self.nextButton.clicked.connect(self.onNextPage)
        self.switchPageButton.clicked.connect(self.onSwitchPage)
    def initializedModel(self):
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("/home/user/test.db")
        if not self.db.open():
            return False
        self.queryModel.setHeaderData(0, Qt.Horizontal, "ID")
        self.queryModel.setHeaderData(1, Qt.Horizontal, "Name")
        self.queryModel.setHeaderData(2, Qt.Horizontal, "Sex")
        self.queryModel.setHeaderData(3, Qt.Horizontal, "Age")
        # 获取表的所有记录数
        sql = "SELECT * FROM student"
        self.queryModel.setQuery(sql, self.db)
        self.totalRecordCount = self.queryModel.rowCount()
        if self.totalRecordCount % self.pageRecordCount == 0:
            self.totalPage = self.totalRecordCount / self.pageRecordCount
        else:
            self.totalPage = int(self.totalRecordCount / self.pageRecordCount) + 1
        # 显示第1页
        sql = "SELECT * FROM student limit %d,%d" % (0, self.pageRecordCount)
        self.queryModel.setQuery(sql, self.db)
    def onPrevPage(self):
        self.currentPage -= 1
        limitIndex = (self.currentPage - 1) * self.pageRecordCount
        self.queryRecord(limitIndex)
        self.updateStatus()
    def onNextPage(self):
        self.currentPage += 1
        limitIndex = (self.currentPage - 1) * self.pageRecordCount
        self.queryRecord(limitIndex)
        self.updateStatus()
    def onSwitchPage(self):
        szText = self.switchPageLineEdit.text()
        pattern = re.compile('^[0-9]+$')
        match = pattern.match(szText)
        if not match:
            QMessageBox.information(self, "提示", "请输入数字.")
            return
        if szText == "":
            QMessageBox.information(self, "提示", "请输入跳转页面.")
            return
        pageIndex = int(szText)
        if pageIndex > self.totalPage or pageIndex < 1:
            QMessageBox.information(self, "提示", "没有指定的页,清重新输入.")
            return
        limitIndex = (pageIndex - 1) * self.pageRecordCount
        self.queryRecord(limitIndex)
        self.currentPage = pageIndex
        self.updateStatus()
    # 根据分页查询记录
    def queryRecord(self, limitIndex):
        sql = "SELECT * FROM student limit %d,%d" % (limitIndex, self.pageRecordCount)
        self.queryModel.setQuery(sql)
    # 更新空间状态
    def updateStatus(self):
        self.currentPageLabel.setText(str(self.currentPage))
        self.totalPageLabel.setText(str(self.totalPage))
        if self.currentPage <= 1:
            self.prevButton.setEnabled(False)
        else:
            self.prevButton.setEnabled(True)
        if self.currentPage >= self.totalPage:
            self.nextButton.setEnabled(False)
        else:
            self.nextButton.setEnabled(True)
    # 界面关闭时关闭数据库连接
    def closeEvent(self, event):
        self.db.close()
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DataGrid()
    window.show()
    sys.exit(app.exec_())

如何进行PyQt5数据库操作

关于如何进行PyQt5数据库操作问题的解答就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/81845.html

(0)

相关推荐

  • Redis中如何实现消息队列和延时消息队列

    技术Redis中如何实现消息队列和延时消息队列这篇文章将为大家详细讲解有关Redis中如何实现消息队列和延时消息队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。list的几个命令lp

    攻略 2021年12月10日
  • 树莓派如何实现CPU温控风扇

    技术树莓派如何实现CPU温控风扇这篇文章主要介绍树莓派如何实现CPU温控风扇,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!树莓派温控风扇三极管方式 J13009三极管(做开关用),管脚说明,面对有

    攻略 2021年11月20日
  • 谷歌地图怎么看街景,手机谷歌地图怎么看街景

    技术谷歌地图怎么看街景,手机谷歌地图怎么看街景1. 谷歌卫星图是可以看街景的,但国内貌似不容易上的谷歌地图怎么看街景。2. 国内用户可以直接用奥维互动地图app看街景,可以连接上,这个软件中也有集成了谷歌卫星图,还有其他

    生活 2021年10月19日
  • 怎么利用SQL SERVER的触发器制作后门

    技术怎么利用SQL SERVER的触发器制作后门小编给大家分享一下怎么利用SQL SERVER的触发器制作后门,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起

    攻略 2021年11月18日
  • Web开发中的CSS库有哪些

    技术Web开发中的CSS库有哪些本篇内容主要讲解“Web开发中的CSS库有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Web开发中的CSS库有哪些”吧!1. KiteK

    攻略 2021年12月10日
  • 编程中常用正则表达式有哪些

    技术编程中常用正则表达式有哪些这篇文章将为大家详细讲解有关编程中常用正则表达式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、校验数字的表达式1 数字:^[0-9]*$2 n位

    攻略 2021年11月23日