此教程为作者做项目时自身的记录,适合快速上手,不过这也可以完整应用于项目,整体的学习建议参考其他教程
pyqt5里面又sqlite的相关组件,安装了pyqt5之后可以直接用,但为了能够图像化查看.db库,建议安装sqlite的图像化界面
1.安装sqlite3
sudo apt install sqlite3
可以通过下列命令查看sqlite版本
sqlite3 --version
2.安装sqlite图形化界面
linux中:
sudo apt install sqlitebrowser
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_())
这里加入了一个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_())
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)
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)
***外键这部分经过测试,存在一定问题,等待后续更新解决吧