人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法

發(fā)布日期:2022-01-04 12:08 | 文章來(lái)源:源碼中國(guó)

在桌面圖像化界面編程中,我們通常需要將一些數(shù)據(jù)或配置信息存儲(chǔ)在本地。在本地進(jìn)行數(shù)據(jù)的存儲(chǔ),我們可以直接使用文本文件,比如ini文件、csv文件、json文件等,或者是使用文件型的數(shù)據(jù)庫(kù)(比如sqlit3)進(jìn)行存儲(chǔ)。

PyQt5的SQL數(shù)據(jù)庫(kù)支持

Qt平臺(tái)對(duì)SQL編程有著良好的支持,PyQt5也一并繼承了過(guò)來(lái)。在PyQt5中,QtSql子模塊提供對(duì)SQL數(shù)據(jù)庫(kù)的支持:

從上圖我們可以發(fā)現(xiàn),QtSQL模塊中包含了很多個(gè)類(lèi),這些類(lèi)歸總起來(lái)主要包含三大部分:

  • 驅(qū)動(dòng)層,用于提供特定數(shù)據(jù)庫(kù)與SQL API接口之間的低級(jí)連接功能;其中包括QSqlDriver、QSqlDriverCreatorBase、QSqlResult;
  • SQL API層,用于提供對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。通常來(lái)說(shuō),我們會(huì)使用QSqlDatabase建立數(shù)據(jù)庫(kù)連接,使用QSqlQuery等類(lèi)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的交互(執(zhí)行SQL語(yǔ)句)。此外還有QSqlError、QSqlField、QSqlIndex、QSqlRecord等類(lèi)。
  • 用戶(hù)界面操作層,用于將數(shù)據(jù)庫(kù)操作的數(shù)據(jù)鏈接到PyQt相應(yīng)的數(shù)據(jù)小部件,將數(shù)據(jù)和操作展示在Qt界面中。這些類(lèi)包括:QSqlQueryModel、QSqlTableModel等。

在這些類(lèi)中,每個(gè)類(lèi)都有自己特定的用途,其中:

  • QSQL:包含整個(gè)Qt SQL模塊中使用的各種標(biāo)識(shí)符
  • QSqlDatabase:處理與數(shù)據(jù)庫(kù)的連接
  • QSqlDriver:用于訪問(wèn)特定SQL數(shù)據(jù)庫(kù)的抽象基類(lèi)
  • QSqlDriverCreator:模板類(lèi),為特定驅(qū)動(dòng)程序類(lèi)型提供SQL驅(qū)動(dòng)程序工廠
  • QSqlDriverCreatorBase:SQL驅(qū)動(dòng)程序工廠的基類(lèi)
  • QSqlError:SQL數(shù)據(jù)庫(kù)錯(cuò)誤信息
  • QSqlField:處理SQL數(shù)據(jù)庫(kù)表和視圖中的字段
  • QSqlIndex:用于操作和描述數(shù)據(jù)庫(kù)索引的函數(shù)
  • QSqlQuery:執(zhí)行和操作SQL語(yǔ)句的方法
  • QSqlQueryModel:SQL結(jié)果集的只讀數(shù)據(jù)模型
  • QSqlRecord:封裝數(shù)據(jù)庫(kù)記錄
  • QSqlRelationalTableModel:具有外鍵支持的單個(gè)數(shù)據(jù)庫(kù)表的可編輯數(shù)據(jù)模型
  • QSqlResult:用于從特定SQL數(shù)據(jù)庫(kù)訪問(wèn)數(shù)據(jù)的抽象接口
  • QSqlTableModel:?jiǎn)蝹€(gè)數(shù)據(jù)庫(kù)表的可編輯數(shù)據(jù)模型

在實(shí)際的PyQt編程中,我們很少使用驅(qū)動(dòng)層的類(lèi),多通過(guò)API層的來(lái)建立數(shù)據(jù)庫(kù)連接、進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)等,然后通過(guò)用戶(hù)界面操作層的類(lèi)將數(shù)據(jù)結(jié)果顯示在圖形界面中。下面我們就來(lái)簡(jiǎn)單使用一下。

在PyQt5中簡(jiǎn)單使用數(shù)據(jù)庫(kù)

創(chuàng)建一個(gè)UI界面

首先,我們通過(guò)PyQt5創(chuàng)建一個(gè)基本的圖形界面。這個(gè)界面由兩個(gè)部分組成:

  • 按鈕操作層:用來(lái)通過(guò)按鈕進(jìn)行數(shù)據(jù)庫(kù)操作;
  • 數(shù)據(jù)庫(kù)展示層:用來(lái)展示數(shù)據(jù)庫(kù)表的信息;

UI界面的代碼如下所示:

# coding:utf-8
from PyQt5 import QtGui,QtCore,QtWidgets,QtSql
import sys
'''
 州的先生 - 在PyQt5中使用數(shù)據(jù)庫(kù)
'''
class MainUi(QtWidgets.QMainWindow):
 def __init__(self):
  super().__init__()
  self.initUi()
 # 初始化UI界面
 def initUi(self):
  # 設(shè)置窗口標(biāo)題
  self.setWindowTitle("州的先生 - 在PyQt5中使用數(shù)據(jù)庫(kù)")
  # 設(shè)置窗口大小
  self.resize(600,400)
  # 創(chuàng)建一個(gè)窗口部件
  self.widget = QtWidgets.QWidget()
  # 創(chuàng)建一個(gè)網(wǎng)格布局
  self.grid_layout = QtWidgets.QGridLayout()
  # 設(shè)置窗口部件的布局為網(wǎng)格布局
  self.widget.setLayout(self.grid_layout)
  # 創(chuàng)建一個(gè)按鈕組
  self.group_box = QtWidgets.QGroupBox('數(shù)據(jù)庫(kù)按鈕')
  self.group_box_layout = QtWidgets.QVBoxLayout()
  self.group_box.setLayout(self.group_box_layout)
  # 創(chuàng)建一個(gè)表格部件
  self.table_widget = QtWidgets.QTableView()
  # 將上述兩個(gè)部件添加到網(wǎng)格布局中
  self.grid_layout.addWidget(self.group_box,0,0)
  self.grid_layout.addWidget(self.table_widget,0,1)
  # 創(chuàng)建按鈕組的按鈕
  self.b_create_db = QtWidgets.QPushButton("創(chuàng)建數(shù)據(jù)庫(kù)")
  self.b_create_db.clicked.connect(self.create_db)
  self.b_view_data = QtWidgets.QPushButton("瀏覽數(shù)據(jù)")
  self.b_add_row = QtWidgets.QPushButton("添加一行")
  self.b_delete_row = QtWidgets.QPushButton("刪除一行")
  self.b_close = QtWidgets.QPushButton("退出")
  self.b_close.clicked.connect(self.close)
  # 添加按鈕到按鈕組中
  self.group_box_layout.addWidget(self.b_create_db)
  self.group_box_layout.addWidget(self.b_view_data)
  self.group_box_layout.addWidget(self.b_add_row)
  self.group_box_layout.addWidget(self.b_delete_row)
  self.group_box_layout.addWidget(self.b_close)
  # 設(shè)置UI界面的核心部件
  self.setCentralWidget(self.widget)

最終顯示出來(lái)的UI界面如下圖所示:

連接一個(gè)數(shù)據(jù)庫(kù)

在上面創(chuàng)建的UI界面中,我們有一個(gè)“創(chuàng)建數(shù)據(jù)庫(kù)”的按鈕,這個(gè)按鈕我們用來(lái)建立一個(gè)數(shù)據(jù)庫(kù)連接。

Qt中內(nèi)置了好幾個(gè)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序,也就是說(shuō)我們可以直接在PyQt中對(duì)這些數(shù)據(jù)庫(kù)進(jìn)行操作。這些內(nèi)置的數(shù)據(jù)庫(kù)包括:

  • IBM DB2,驅(qū)動(dòng)名為QDB2;
  • Borland InterBase,驅(qū)動(dòng)名為QIBASE;
  • MySQL,驅(qū)動(dòng)名為QMYSQL;
  • Oracle,驅(qū)動(dòng)名為QOCI;
  • Microsoft SQL Server和其他符合ODBC的數(shù)據(jù)庫(kù),驅(qū)動(dòng)名為QODBC;
  • PostgreSQL,驅(qū)動(dòng)名為QPSQL;
  • SQLite2,驅(qū)動(dòng)名為QSQLITE2;
  • SQLite3,驅(qū)動(dòng)名為QSQLITE;

通過(guò)這些驅(qū)動(dòng)名,我們可以借助QSqlDatabase類(lèi)的addDatabase方法添加某個(gè)數(shù)據(jù)庫(kù)的連接,比如建立一個(gè)MySQL數(shù)據(jù)庫(kù)的連接為:

db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('主機(jī)名')
db.setDatabaseName('數(shù)據(jù)庫(kù)名')
db.setUserName('用戶(hù)名')
db.setPassword('密碼')
db.open()

為了方便演示,在此我們使用Sqlite數(shù)據(jù)庫(kù)。

在MainUi()類(lèi)中,我們創(chuàng)建一個(gè)名為create_db()的方法:

# 創(chuàng)建數(shù)據(jù)庫(kù)
 def create_db(self):
  try:
# 調(diào)用輸入框獲取數(shù)據(jù)庫(kù)名稱(chēng)
db_text,db_action = QtWidgets.QInputDialog.getText(self,'數(shù)據(jù)庫(kù)名稱(chēng)','請(qǐng)輸入數(shù)據(jù)庫(kù)名稱(chēng)',QtWidgets.QLineEdit.Normal)
if (db_text.replace(' ','') != '') and (db_action is True):
 print(db_text)
 self.db_name = db_text
 # 添加一個(gè)sqlite數(shù)據(jù)庫(kù)連接并打開(kāi)
 db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
 db.setDatabaseName('{}.sqlite'.format(db_text))
 db.open()
 # 實(shí)例化一個(gè)查詢(xún)對(duì)象
 query = QtSql.QSqlQuery()
 # 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表
 query.exec_("create table zmister(ID int primary key, "
"site_name varchar(20), site_url varchar(100))")
 # 插入三條數(shù)據(jù)
 query.exec_("insert into zmister values(1000, '州的先生', 'https://zmister.com')")
 query.exec_("insert into zmister values(1001, '百度', 'http://www.baidu.com')")
 query.exec_("insert into zmister values(1002, '騰訊', 'http://www.qq.com')")
 print('創(chuàng)建數(shù)據(jù)庫(kù)成功')
  except Exception as e:
print(e)

在這個(gè)方法中,我們自定義數(shù)據(jù)庫(kù)名并創(chuàng)建一個(gè)sqlite數(shù)據(jù)庫(kù),然后在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)名為zmister的數(shù)據(jù)庫(kù)表,最后在zmister數(shù)據(jù)庫(kù)表中插入了三條數(shù)據(jù)。

接下來(lái),我們將這個(gè)方法綁定到【創(chuàng)建數(shù)據(jù)庫(kù)】按鈕的點(diǎn)擊事件上:

self.b_create_db.clicked.connect(self.create_db)

這樣,當(dāng)我們點(diǎn)擊【創(chuàng)建數(shù)據(jù)庫(kù)】按鈕的時(shí)候,UI界面會(huì)彈出一個(gè)文本輸入框供我們輸入數(shù)據(jù)庫(kù)的名稱(chēng),然后創(chuàng)建一個(gè)數(shù)據(jù)表并插入數(shù)據(jù):

完成操作之后,會(huì)發(fā)現(xiàn)文件同級(jí)目錄下多出了一個(gè)zmister.sqlite文件,我們使用SQLite Expert等SQLite數(shù)據(jù)庫(kù)可視化軟件打開(kāi)它:

這樣,我們就成功在PyQt5中創(chuàng)建連接并寫(xiě)入操作了一個(gè)數(shù)據(jù)庫(kù)。

在UI界面查看和修改數(shù)據(jù)

上面我們創(chuàng)建了一個(gè)SQLite數(shù)據(jù)庫(kù)并在其中寫(xiě)入了三條數(shù)據(jù),如何將數(shù)據(jù)表中的數(shù)據(jù)顯示在UI界面中呢。我們可以借助QSqlTableModel類(lèi)來(lái)實(shí)現(xiàn)。

還記得我們?cè)趧?chuàng)建UI界面的時(shí)候,在界面的右方放置了一個(gè)QTableView()部件,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)將顯示在這上面。

繼續(xù)在MainUi()類(lèi)中創(chuàng)建一個(gè)名為view_data()的方法,在方法中實(shí)例化一個(gè)QSqlTableModel(),并將QTableView()部件的model模型設(shè)置為實(shí)例化后的QSqlTableModel():

 # 瀏覽數(shù)據(jù)
 def view_data(self):
  # 實(shí)例化一個(gè)可編輯數(shù)據(jù)模型
  self.model = QtSql.QSqlTableModel()
  self.table_widget.setModel(self.model)
  self.model.setTable('zmister') # 設(shè)置數(shù)據(jù)模型的數(shù)據(jù)表
  self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) # 允許字段更改
  self.model.select() # 查詢(xún)所有數(shù)據(jù)
  # 設(shè)置表格頭
  self.model.setHeaderData(0,QtCore.Qt.Horizontal,'ID')
  self.model.setHeaderData(1, QtCore.Qt.Horizontal, '站點(diǎn)名稱(chēng)')
  self.model.setHeaderData(2, QtCore.Qt.Horizontal, '站點(diǎn)地址')

然后,將view_data()方法綁定在UI界面的【瀏覽數(shù)據(jù)】按鈕的點(diǎn)擊事件中:

self.b_view_data.clicked.connect(self.view_data)

這樣,我們?cè)邳c(diǎn)擊【瀏覽數(shù)據(jù)】按鈕的時(shí)候,會(huì)將zmister表中的所有數(shù)據(jù)顯示出來(lái):

除了簡(jiǎn)單的將數(shù)據(jù)顯示在UI界面上,我們還可以直接在UI界面上修改數(shù)據(jù):

添加和刪除數(shù)據(jù)

完成查和改的SQL操作之后,我們接著來(lái)了解一下如何添加數(shù)據(jù)和刪除數(shù)據(jù)。

添加數(shù)據(jù)通過(guò)數(shù)據(jù)模型對(duì)象的insertRows()方法來(lái)實(shí)現(xiàn),刪除數(shù)據(jù)則通過(guò)數(shù)據(jù)模型對(duì)象的removeRow()方法來(lái)實(shí)現(xiàn)。

我們繼續(xù)在MainUi()類(lèi)中創(chuàng)建兩個(gè)方法:add_row_data()和del_row_data():

  # 添加一行數(shù)據(jù)行
 def add_row_data(self):
  # 如果存在實(shí)例化的數(shù)據(jù)模型對(duì)象
  if self.model:
self.model.insertRows(self.model.rowCount(), 1)
  else:
self.create_db()
 # 刪除一行數(shù)據(jù)
 def del_row_data(self):
  if self.model:
self.model.removeRow(self.table_widget.currentIndex().row())
  else:
self.create_db()

然后將這兩個(gè)方法分別綁定在【添加一行】和【刪除一行】按鈕的點(diǎn)擊事件上:

self.b_add_row.clicked.connect(self.add_row_data)
self.b_delete_row.clicked.connect(self.del_row_data)

這樣就實(shí)現(xiàn)了UI界面上的添加數(shù)據(jù)和刪除數(shù)據(jù):

這樣,我們就基本實(shí)現(xiàn)了使用PyQt5對(duì)數(shù)據(jù)庫(kù)的增刪改查操作,更加詳細(xì)的使用和說(shuō)明請(qǐng)參考Qt文檔。

到此這篇關(guān)于Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法的文章就介紹到這了,更多相關(guān)PyQt5使用數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶(hù)服務(wù)

7x24全年不間斷在線

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶(hù)咨詢(xún)顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部