目錄
一.操作SQLite資料庫
二.使用可視化的方式對SQLite資料庫進行增刪改查操作
三.分頁顯示資料
一.操作SQLite資料庫
輕量級資料庫,支持多種介面,跨平臺
現在很多移動應用(eg:安卓,iOS)都使用SQLite作為本地資料庫
本地資料庫只需要提供檔案名,而不需要IP,用戶名,密碼啥的
資料庫可視化工具DB Browser for SQLite:
官網:http://www.sqlitebrowser.org/
下載:http://www.sqlitebrowser.org/dl/
代碼:
from PyQt5.QtSql import QSqlDatabase,QSqlQuery
def createDB():
db=QSqlDatabase.addDatabase('QSQLITE')#指定資料庫型別
#指定SQLite資料庫檔案名
db.setDatabaseName('./db/muttonDB.db')#muttonDB.db之前的目錄都要存在才可建立成功!資料庫名字自己隨便起
if not db.open():
print('無法建立與資料庫的連接')
return False
query=QSqlQuery()
query.exec('create table people(id int primary key,name varcahr(10),address varcahr(50))')
query.exec('insert into people values(1,"李寧","Shenyang")')
query.exec('insert into people values(2,"超人","克星")')
db.close()
return True
if __name__=='__main__':
createDB()
運行結果:

打開資料庫即可,
二.使用可視化的方式對SQLite資料庫進行增刪改查操作
QTableView
QSql TableModel
代碼:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtSql import *
#初始化
def initializeModel(model):
model.setTable('people')
#當欄位變化時會觸發一些事件
model.setEditStrategy(QSqlTableModel.OnFieldChange)
#將整個資料裝載到model中
model.select()
#設定欄位頭
model.setHeaderData(0, Qt.Horizontal,'ID')
model.setHeaderData(1, Qt.Horizontal, '姓名')
model.setHeaderData(2, Qt.Horizontal, '地址')
#創建視圖
def createView(title,model):
view = QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
def findrow(i):
#當前選中的行
delrow = i.row()
print('del row=%s' % str(delrow))
def addrow():
#不是在QTableView上添加,而是在模型上添加,會自動將資料保存到資料庫中!
# 引數一:資料庫共有幾行資料 引數二:添加幾行
ret = model.insertRows(model.rowCount(),1)#回傳是否插入
print('資料庫共有%d行資料' % model.rowCount())
print('insertRow=%s' % str(ret))
if __name__ == '__main__':
app = QApplication(sys.argv)
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('./db/muttonDB.db')
model = QSqlTableModel()#MVC模式中的模型
delrow = -1
#初始化將資料裝載到模型當中
initializeModel(model)
view = createView("展示資料",model)
view.clicked.connect(findrow)
dlg = QDialog()
layout = QVBoxLayout()
layout.addWidget(view)
addBtn = QPushButton('添加一行')
addBtn.clicked.connect(addrow)
delBtn = QPushButton('洗掉一行')
delBtn.clicked.connect(lambda :model.removeRow(view.currentIndex().row()))
layout.addWidget(view)
layout.addWidget(addBtn)
layout.addWidget(delBtn)
dlg.setLayout(layout)
dlg.setWindowTitle("Database Demo")
dlg.resize(500,400)
dlg.show()
sys.exit(app.exec())
運行結果:
功能自測 
三.分頁顯示資料
limit關鍵字
limit n,m
n是起始點(不含),m是偏移量,例如 limit 10,20代表從11開始的20條資料,即11-30
代碼:
import sys
from PyQt5.QtWidgets import*
from PyQt5.QtCore import Qt
from PyQt5.QtSql import *
class DataGrid(QWidget):
def createTableAndInit(self):
# 添加資料庫
self.db = QSqlDatabase.addDatabase('QSQLITE')
# 設定資料庫名稱
self.db.setDatabaseName('./db/database.db')
# 判斷是否打開
if not self.db.open():
return False
# 宣告資料庫查詢物件
query = QSqlQuery()
# 創建表
query.exec("create table student(id int primary key, name vchar, sex vchar, age int, deparment vchar)")
# 添加記錄
query.exec("insert into student values(1,'張三1','男',20,'計算機')")
query.exec("insert into student values(2,'李四1','男',19,'經管')")
query.exec("insert into student values(3,'王五1','男',22,'機械')")
query.exec("insert into student values(4,'趙六1','男',21,'法律')")
query.exec("insert into student values(5,'小明1','男',20,'英語')")
query.exec("insert into student values(6,'小李1','女',19,'計算機')")
query.exec("insert into student values(7,'小張1','男',20,'機械')")
query.exec("insert into student values(8,'小剛1','男',19,'經管')")
query.exec("insert into student values(9,'張三2','男',21,'計算機')")
query.exec("insert into student values(10,'張三3','女',20,'法律')")
query.exec("insert into student values(11,'王五2','男',19,'經管')")
query.exec("insert into student values(12,'張三4','男',20,'計算機')")
query.exec("insert into student values(13,'小李2','男',20,'機械')")
query.exec("insert into student values(14,'李四2','女',19,'經管')")
query.exec("insert into student values(15,'趙六3','男',21,'英語')")
query.exec("insert into student values(16,'李四2','男',19,'法律')")
query.exec("insert into student values(17,'小張2','女',22,'經管')")
query.exec("insert into student values(18,'李四3','男',21,'英語')")
query.exec("insert into student values(19,'小李3','女',19,'法律')")
query.exec("insert into student values(20,'王五3','女',20,'機械')")
query.exec("insert into student values(21,'張三4','男',22,'計算機')")
query.exec("insert into student values(22,'小李2','男',20,'法律')")
query.exec("insert into student values(23,'張三5','男',19,'經管')")
query.exec("insert into student values(24,'小張3','女',20,'計算機')")
query.exec("insert into student values(25,'李四4','男',22,'英語')")
query.exec("insert into student values(26,'趙六2','男',20,'機械')")
query.exec("insert into student values(27,'小李3','女',19,'英語')")
query.exec("insert into student values(28,'王五4','男',21,'經管')")
return True
def __init__(self):
super().__init__()
self.setWindowTitle("分頁查詢例子")
self.resize(750, 350)
self.createTableAndInit()
# 當前頁
self.currentPage = 0
# 總頁數
self.totalPage = 0
# 總記錄數
self.totalRecrodCount = 0
# 每頁顯示記錄數
self.PageRecordCount = 6
self.initUI()
def initUI(self):
# 創建視窗
self.createWindow()
# 設定表格
self.setTableView()
# 信號槽連接
self.prevButton.clicked.connect(self.onPrevButtonClick)
self.nextButton.clicked.connect(self.onNextButtonClick)
self.switchPageButton.clicked.connect(self.onSwitchPageButtonClick)
def closeEvent(self, event):
# 關閉資料庫
self.db.close()
# 創建視窗
def createWindow(self):
# 操作布局
operatorLayout = QHBoxLayout()
self.prevButton = QPushButton("前一頁")
self.nextButton = QPushButton("后一頁")
self.switchPageButton = QPushButton("Go")
self.switchPageLineEdit = QLineEdit()
self.switchPageLineEdit.setFixedWidth(40)
switchPage = QLabel("轉到第")
page = QLabel("頁")
operatorLayout.addWidget(self.prevButton)
operatorLayout.addWidget(self.nextButton)
operatorLayout.addWidget(switchPage)
operatorLayout.addWidget(self.switchPageLineEdit)
operatorLayout.addWidget(page)
operatorLayout.addWidget(self.switchPageButton)
operatorLayout.addWidget(QSplitter())
# 狀態布局
statusLayout = QHBoxLayout()
self.totalPageLabel = QLabel()
self.totalPageLabel.setFixedWidth(70)
self.currentPageLabel = QLabel()
self.currentPageLabel.setFixedWidth(70)
self.totalRecordLabel = QLabel()
self.totalRecordLabel.setFixedWidth(70)
statusLayout.addWidget(self.totalPageLabel)
statusLayout.addWidget(self.currentPageLabel)
statusLayout.addWidget(QSplitter())
statusLayout.addWidget(self.totalRecordLabel)
# 設定表格屬性
self.tableView = QTableView()
# 表格寬度的自適應調整
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# 創建界面
mainLayout = QVBoxLayout(self);
mainLayout.addLayout(operatorLayout);
mainLayout.addWidget(self.tableView);
mainLayout.addLayout(statusLayout);
self.setLayout(mainLayout)
# 設定表格
def setTableView(self):
# 宣告查詢模型
self.queryModel = QSqlQueryModel(self)
# 設定當前頁
self.currentPage = 1;
# 得到總記錄數
self.totalRecrodCount = self.getTotalRecordCount()
# 得到總頁數
self.totalPage = self.getPageCount()
# 重繪狀態
self.updateStatus()
# 設定總頁數文本
self.setTotalPageLabel()
# 設定總記錄數
self.setTotalRecordLabel()
# 記錄查詢
self.recordQuery(0)
# 設定模型
self.tableView.setModel(self.queryModel)
print('totalRecrodCount=' + str(self.totalRecrodCount))
print('totalPage=' + str(self.totalPage))
# 設定表格表頭
self.queryModel.setHeaderData(0, Qt.Horizontal, "編號")
self.queryModel.setHeaderData(1, Qt.Horizontal, "姓名")
self.queryModel.setHeaderData(2, Qt.Horizontal, "性別")
self.queryModel.setHeaderData(3, Qt.Horizontal, "年齡")
self.queryModel.setHeaderData(4, Qt.Horizontal, "院系")
# 得到記錄數
def getTotalRecordCount(self):
self.queryModel.setQuery("select * from student")
rowCount = self.queryModel.rowCount()
print('rowCount=' + str(rowCount))
return rowCount
# 得到頁數
def getPageCount(self):
if self.totalRecrodCount % self.PageRecordCount == 0:
return (self.totalRecrodCount / self.PageRecordCount)
else:
return (self.totalRecrodCount / self.PageRecordCount + 1)
# 記錄查詢
def recordQuery(self, limitIndex):
szQuery = ("select * from student limit %d,%d" % (limitIndex, self.PageRecordCount))
print('query sql=' + szQuery)
self.queryModel.setQuery(szQuery)
# 重繪狀態
def updateStatus(self):
szCurrentText = ("當前第%d頁" % self.currentPage)
self.currentPageLabel.setText(szCurrentText)
# 設定按鈕是否可用
if self.currentPage == 1:
self.prevButton.setEnabled(False)
self.nextButton.setEnabled(True)
elif self.currentPage == self.totalPage:
self.prevButton.setEnabled(True)
self.nextButton.setEnabled(False)
else:
self.prevButton.setEnabled(True)
self.nextButton.setEnabled(True)
# 設定總數頁文本
def setTotalPageLabel(self):
szPageCountText = ("總共%d頁" % self.totalPage)
self.totalPageLabel.setText(szPageCountText)
# 設定總記錄數
def setTotalRecordLabel(self):
szTotalRecordText = ("共%d條" % self.totalRecrodCount)
print('*** setTotalRecordLabel szTotalRecordText=' + szTotalRecordText)
self.totalRecordLabel.setText(szTotalRecordText)
# 前一頁按鈕按下
def onPrevButtonClick(self):
print('*** onPrevButtonClick ');
limitIndex = (self.currentPage - 2) * self.PageRecordCount
self.recordQuery(limitIndex)
self.currentPage -= 1
self.updateStatus()
# 后一頁按鈕按下
def onNextButtonClick(self):
print('*** onNextButtonClick ');
limitIndex = self.currentPage * self.PageRecordCount
self.recordQuery(limitIndex)
self.currentPage += 1
self.updateStatus()
# 轉到頁按鈕按下
def onSwitchPageButtonClick(self):
# 得到輸入字串
szText = self.switchPageLineEdit.text()
# 得到頁數
pageIndex = int(szText)
# 判斷是否有指定頁
if pageIndex > self.totalPage or pageIndex < 1:
QMessageBox.information(self, "提示", "沒有指定的頁面,請重新輸入")
return
# 得到查詢起始行號
limitIndex = (pageIndex - 1) * self.PageRecordCount
# 記錄查詢
self.recordQuery(limitIndex);
# 設定當前頁
self.currentPage = pageIndex
# 重繪狀態
self.updateStatus();
if __name__ == '__main__':
app = QApplication(sys.argv)
# 創建視窗
example = DataGrid()
# 顯示視窗
example.show()
sys.exit(app.exec_())
運行結果:
自己試試吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/262085.html
標籤:其他
