PyQt5快速⼊门(⼋)PyQt5数据库操作
⼀、SQLite数据库
1、SQLite简介
SQLite是⼀个轻量级的数据库,实现了⾃给⾃⾜、⽆服务器、零配置、事务性的SQL数据库引擎,主要作为⼿机应⽤的数据库以及⼩型桌⾯应⽤的数据库。
官⽅⽹站:
2、SQLite常⽤操作
创建数据库⽂件,创建后进⾏⼊SQLite命令⾏模式。
sqlite3 DatabaseName.db
查看已经存在的数据库⽂件,在SQLite命令⾏模式执⾏:
.databases
打开已经存在的数据库⽂件,如果数据库⽂件不存在,则创建。
sqlite3 DatabaseName.db
查看帮助信息,在SQLite命令⾏模式执⾏:
.help
创建表,在SQLite命令⾏模式执⾏:
create table person(id integer primary key, name text);
插⼊数据到表:
insert into person(id, name) values(1, "zhangsan");
查询操作:
select * from person;
查询表的结构:
.内网审计
schema person
3、SQLite管理⼯具
SQLite有多个开源且优秀的DBMS(数据库管理系统),提供了界⾯操作SQLite数据库。
SQLiteStudio是⼀款⾮常专业的SQLite数据库管理软件,体积⼩巧,功能强⼤,⽀持中⽂,免安装。
SQLiteStudio下载:
1、数据库驱动类型
PyQt中,QSqlDatabase类⽤于连接数据库,可以使⽤数据库驱动与不同的数据库进⾏交互,⼀个QSqlDatabase实例代表⼀次数据库连接。可⽤数据库驱动类型如下:
QDB2 IBM DB2驱动程序
QMYSQL MySQL驱动程序
QOCI Oracle调⽤接⼝驱动程序
QODBC ODBC驱动程序(包括MS SQL Server)
QPSQL PostgreSQL驱动程序
QSQLITE SQLite3驱动程序
QSQLITE2 SQLite2驱动程序
2、QSqlDatabase常⽤⽅法
QSqlDatabase常⽤⽅法如下:
addDataBase:设置连接数据库的数据库驱动类型 setDatabaseName:设置所连接的数据库名称
setHostName:设置数据库所在的主机名称
setUserName:指定连接的⽤户名
setPassword:设置连接对象的密码
commit:提交事务,如果执⾏成功返回True。
rollback:回滚数据库事务
close:关闭数据库连接
3、数据库连接实例
import sys
from PyQt5.QtSql import QSqlDatabase
from PyQt5.QtCore import *vsel
if __name__ == "__main__":
app = QCoreApplication(sys.argv)
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("/home/user/test.db")
if db.open():
print("open DB success.")
<_())
三、执⾏SQL语句
QSqlQuery具有执⾏和操作SQL语句的功能,可以执⾏DDL和DML类型的SQL查询,_()⽤于执⾏SQL操作。
import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
from PyQt5.QtCore import *
def createDB():
泰尹网wiy5db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("/home/user/test.db")
if db.open():
query = QSqlQuery()
<_("create table person(id int primary key, name varchar(20), address varchar(30))")
<_("insert into person values(1, 'Bauer', 'beijing')")
<_("insert into person values(2, 'Jack', 'shanghai')")
<_("insert into person values(3, 'Alex', 'chengdu')")
db.close()
if __name__ == "__main__":
app = QCoreApplication(sys.argv)
createDB()
<_())
执⾏完SQL语句后,如果没有其它数据库操作,需要使⽤db.close关闭数据库连接,因为数据库连接资源是有限的,不再使⽤的数据库连接必须关闭,否则数据库连接资源最终会被耗尽,导致程序⽆法正常连接数据库。
如果在PyQt的窗⼝中需要读取数据库的数据并进⾏显⽰,则需要在窗⼝初始化时打开数据库,在窗⼝关闭时关闭数据库连接。
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()
<_())
四、数据库模型视图
Qt中的QSqlTableModel是⼀个⾼级接⼝,提供了可读可写的数据模型,⽤于在单个表中读取和保存数
据,可以在QTableView展⽰数据库的表格。当连接到数据库后,使⽤seTable设置要查询的表,使⽤setFilter函数设置过滤器条件,然后使⽤select函数进⾏查询操作。可以使⽤setEditerStrategy函数设置编辑策略,可设置编辑策略如下:
QSqlTableModel.OnFieldChange:所有变更实时更新到数据库
QSqlTableModel.OnRowChange:当⽤户选择不同的⾏时,在当前⾏进⾏更新
QSqlTableModel.OnManuallSubmit:⼿动提交,不⾃动提交
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.initializedModel()
self.tableView = QTableView()
self.tableView.del)
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)
AddRow)
DeleteRow)
def initializedModel(self):
def onAddRow(self):
def onDeleteRow(self):
刷握
def closeEvent(self, event):
self.db.close()
if __name__ == "__main__":cielab
app = QApplication(sys.argv)
window = MainWindow()
window.show()
<_())
五、分页查询
1、数据准备
分页使⽤数据为学⽣信息student表,可以使⽤SQLite命令⾏使⽤SQL语句插⼊,也可以使⽤Python程序创建表并插⼊数据。
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("/home/user/test.db")
if not db.open():
return False
query = QSqlQuery()
<_("create table student(id int primary key, name varchar(20), sex varchar(8), age int);")
<_("insert into student values(1, 'Bauer', 'Man', 25)")
<_("insert into student values(2, 'Alex', 'Man', 24)")
<_("insert into student values(3, 'Mary', 'Female', 23)")
<_("insert into student values(4, 'Jack', 'Man', 25)")
<_("insert into student values(5, 'xiaoming', 'Man', 24)")
<_("insert into student values(6, 'xiaohong', 'Female', 23)")
<_("insert into student values(7, 'xiaowang', 'Man', 25)")
异形注塑模板
<_("insert into student values(8, 'xiaozhang', 'Man', 25)")
<_("insert into student values(9, 'xiaoli', 'Man', 25)")
<_("insert into student values(10, 'xiaohan', 'Man', 25)")
2、分页窗⼝
分页窗⼝包括标签、前⼀页、后⼀页、跳转按钮等。