pyqt5 数据库sqlite使用快速上手(linux、window安装、基本使用)

QSqlite

前言

此教程为作者做项目时自身的记录,适合快速上手,不过这也可以完整应用于项目,整体的学习建议参考其他教程

SQLite安装

pyqt5里面又sqlite的相关组件,安装了pyqt5之后可以直接用,但为了能够图像化查看.db库,建议安装sqlite的图像化界面

1.安装sqlite3

sudo apt install sqlite3

可以通过下列命令查看sqlite版本

sqlite3 --version

2.安装sqlite图形化界面

linux中:

sudo apt install sqlitebrowser

安装后打开.db文件的效果
在这里插入图片描述

Windows需要下载软件:
链接:sqlitebrowserwindows下载页面
界面基本和linux一致

基本使用

数据库的连接和结束

import sys
from PyQt5.QtSql import QSqlDatabase
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox,QTableView


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.db = None
        self.db_connect()

    def db_connect(self):
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        # 连接类型为'QSQLITE'的数据库
        self.db.setDatabaseName('./test.db')
        # 打开'./test.db'数据库,如果没有则创建
        if not self.db.open():                           # 打开失败则报错
            QMessageBox.critical(self, 'Database Connection', self.db.lastError().text())

    # 窗口关闭时关闭数据库
    def closeEvent(self, QCloseEvent):
        self.db.close()

    def createTable(self):
        query = QSqlQuery()
        query.exec("create table students"
                   "(id int(13) primary key, class varchar(4) not null,name varchar(25) not null, score float)")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

数据库中Table创建

这里加入了一个creatTable()函数

这里加入了QSqlQuery,这个有很多的用法,这里不做过多介绍,我们主要把他作为一个创建Table的就行了,query.exec_()这里就是把括号里面的话拿到sqlite运行,了解数据库,这里就自然明白

import sys
from PyQt5.QtSql import QSqlDatabase
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.db = None
        self.db_connect()
        self.createTable()

    def db_connect(self):
        self.db = QSqlDatabase.addDatabase('QSQLITE')    
        # 连接类型为'QSQLITE'的数据库
        self.db.setDatabaseName('./test.db')             
        # 打开'./test.db'数据库,如果没有则创建
        if not self.db.open():                           # 打开失败则报错
            QMessageBox.critical(self, 'Database Connection', self.db.lastError().text())

    def closeEvent(self, QCloseEvent):                   # 窗口关闭时关闭数据库
        self.db.close()
    
    def createTable(self):
        query = QSqlQuery()
        # 创建students Table
        query.exec("create table students"
                   "(id int(13) primary key, class varchar(4) not null,name varchar(25) not null, score float)")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

创建完成后,你就可以看到这个Table了
在这里插入图片描述

数据库中Table的操作

1.这里我们直接采用最方便的QSqlTableModel,当然为了可以显示表,我们也引入QTableView来进行显示
2.为了方便,我们让类直接继承QTableView
这里我们的操作代码在sql_exec(),记住每次加入的数据主键必须不同,否则加入出错

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtSql import QSqlDatabase,QSqlTableModel,QSqlQuery	# 1
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox,QTableView


class Demo(QTableView):	# 2
    def __init__(self):
        super(Demo, self).__init__()
        self.db = None
        self.db_connect()
        self.createTable()	# 如果你已经创建过就不要再执行这行
        self.sql_exec()

    def db_connect(self):
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('./test.db')
        if not self.db.open():
            QMessageBox.critical(self, 'Database Connection', self.db.lastError().text())

    def closeEvent(self, QCloseEvent):
        self.db.close()

    def createTable(self):
        query = QSqlQuery()
        query.exec("create table students"
                   "(id int(13) primary key, class varchar(4) not null,name varchar(25) not null, score float)")

    def sql_exec(self):
        model = QSqlTableModel()
        model.setTable('students')		# 选择students表
        model.setEditStrategy(QSqlTableModel.OnFieldChange)	# 这里表示让其立即更新
        model.setHeaderData(0, Qt.Horizontal, 'id')
        model.setHeaderData(1, Qt.Horizontal, 'class')
        model.setHeaderData(2, Qt.Horizontal, 'name')
        model.setHeaderData(3, Qt.Horizontal, 'score')
        model.select()

        model.insertRow(0)  # 1
        model.setData(model.index(0, 0), 2019011202009)
        model.setData(model.index(0, 1), '1005')
        model.setData(model.index(0, 2), 'CXKHHH')
        model.setData(model.index(0, 3), 78)
        model.submit()  # 每次操作进行一次submit更新,比如插入不同行之前都要更新一次

        model.insertRow(1)  # 1
        model.setData(model.index(1, 0), 2019011202008)
        model.setData(model.index(1, 1), '1004')
        model.setData(model.index(1, 2), 'LYF')
        model.setData(model.index(1, 3), 90)
        model.submit()  # 每次操作进行一次submit更新,比如插入不同行之前都要更新一次

        self.setModel(model)

        for i in range(model.rowCount()):               # 3
            id = model.record(i).value('id')
            name = model.record(i).value(1)
            print(id, name)

        print('---------------------')

        for i in range(model.rowCount()):               # 4
            id = model.data(model.index(i, 0))
            name = model.data(model.index(i, 1))
            print(id, name)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

备注:
model.setEditStrategy(QSqlTableModel.OnFieldChange) # 这里表示让其立即更新
其他的更新方式,参考下图
在这里插入图片描述

运行效果,命令行输出,和TableView显示
在这里插入图片描述
筛选,就用一个setFilter,当然要记得跑代码时别逻辑冲突了,别把creatTable还在运行,相同的key的数据还在insert

    def sql_exec(self):
        model = QSqlTableModel()
        model.setTable('students')		# 选择students表
        model.setEditStrategy(QSqlTableModel.OnFieldChange)	# 这里表示让其立即更新
        model.setHeaderData(0, Qt.Horizontal, 'id')
        model.setHeaderData(1, Qt.Horizontal, 'class')
        model.setHeaderData(2, Qt.Horizontal, 'name')
        model.setHeaderData(3, Qt.Horizontal, 'score')

        model.setFilter('score < 85')
        model.select()

        self.setModel(model)

跑的结果
在这里插入图片描述
删除行,用removeRow,当然其他删除同理

    def sql_exec(self):
        model = QSqlTableModel()
        model.setTable('students')		# 选择students表
        model.setEditStrategy(QSqlTableModel.OnFieldChange)	# 这里表示让其立即更新
        model.setHeaderData(0, Qt.Horizontal, 'id')
        model.setHeaderData(1, Qt.Horizontal, 'class')
        model.setHeaderData(2, Qt.Horizontal, 'name')
        model.setHeaderData(3, Qt.Horizontal, 'score')
        model.select()

        model.removeRow(0)  # 1
        model.submit()

        self.setModel(model)

跑的效果
在这里插入图片描述
外键 用QSqlRelationalTableModel,该模型用来建立表之间的联系

先再创建一个teacher表


   def createTable(self):
       query = QSqlQuery()
       query.exec("create table teacher"
                  "(class varchar(4) primary key, name varchar(11) not null)")


   def sql_exec(self):
       model = QSqlTableModel()
       model.setTable('teacher')		# 选择teacher表
       model.setEditStrategy(QSqlTableModel.OnFieldChange)	# 这里表示让其立即更新
       model.setHeaderData(0, Qt.Horizontal, 'class')
       model.setHeaderData(1, Qt.Horizontal, 'name')
       model.select()


       model.insertRow(0)  # 1
       model.setData(model.index(0, 0), '1005')
       model.setData(model.index(0, 1), 'Mr.R')
       model.submit()  # 每次操作进行一次submit更新,比如插入不同行之前都要更新一次
       
       model.insertRow(1)  # 1
       model.setData(model.index(1, 0), '1004')
       model.setData(model.index(1, 1), 'Ms.L')
       model.submit()  # 每次操作进行一次submit更新,比如插入不同行之前都要更新一次


       self.setModel(model)

在这里插入图片描述

***外键这部分经过测试,存在一定问题,等待后续更新解决吧

猜你喜欢

转载自blog.csdn.net/qin_liang/article/details/126940983