Python PyQt实现数据库绑定功能 (pyqt 绑定数据库)

在企业信息化应用中,数据库的使用是不可避免的需求。而在Python中,使用PyQt框架可以很方便地实现数据库绑定功能,简化了开发者的工作,提高开发效率。本文将介绍的实现方法。

一、Python PyQt与数据库

Python PyQt是Python语言的一个GUI编程框架,通过与数据库的结合,能够实现灵活快速的数据管理操作。PyQt可以操作绝大多数的数据库,包括SQLite、MySQL、Oracle等等。

通过使用PyQt实现数据库绑定功能,可以方便地将数据表或视图与控件进行绑定,实现数据的自动更新与显示,这大大减轻了程序员的负担,提高了开发效率。

二、PyQt与SQLite数据库的绑定

在实现数据库绑定功能时,我们首先需要选择合适的数据库。在本文中,我们选择SQLite,这是一个轻量级的数据库,非常适合小型项目的使用。

1. PySQLite模块的安装

首先需要安装PySQLite模块,这个模块提供了Python对SQLite数据库的支持。可以通过pip工具进行安装:

“`python

pip install pysqlite3

“`

安装完成后,我们就可以开始使用这个模块了。

2. 建立SQLite数据库

我们需要在SQLite数据库中创建一张表,来存储将要绑定的数据。以员工信息表为例,表结构如下:

“`SQL

CREATE TABLE employee (

id INTEGER PRIMARY KEY AUTOINCREMENT,

name VARCHAR(20) NOT NULL,

gender VARCHAR(2) NOT NULL,

age INTEGER DEFAULT 0,

department VARCHAR(50) NOT NULL

)

“`

这个表包含了员工的基本信息,包括编号、姓名、性别、年龄和所在部门。

3. 建立PyQt窗口

我们需要创建一个PyQt窗口,用来显示员工信息表中的数据。这个窗口需要包含一个QTableView控件,用来显示表格数据。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QTableView

from PyQt5.QtSql import QSqlDatabase,QSqlQuery

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

self.tableView=QTableView(self)

self.tableView.setGeometry(20,20,440,240)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QtSql.QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder) # 按第0列降序排列

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents() # 自适应列宽

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个QMnWindow窗口,包含了一个QTableView控件。同时,我们通过QSqlDatabase.addDatabase(‘QSQLITE’)方法创建了一个SQLite数据库,并连接到了名为employee.db的数据库文件。在连接成功后,我们可以通过QSqlQuery对象进行查询和更新数据库。这里的QSqlTableModel控件可以方便地与数据库中的数据表进行绑定。

我们将表格设置为自适应列宽。这样,每个字段的宽度将调整得足够宽,可以容纳数据,增加用户体验。

三、绑定控件与数据库

在上一节中,我们已经实现了创建PyQt窗口和连接SQLite数据库的功能。下一步是实现控件与数据库的绑定,以自动更新数据。

1. 实现数据插入

我们可以使用QSqlQuery对象插入新的员工记录。当我们单击插入按钮时,一个新的员工记录将入到数据库中。同时,表格中的数据也将刷新。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QWidget,QHBoxLayout,QVBoxLayout,QTableView,QLineEdit,QPushButton

from PyQt5.QtSql import QSqlDatabase,QSqlQuery,QSqlTableModel

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

centralWidget=QWidget(self)

self.setCentralWidget(centralWidget)

self.tableView=QTableView(self)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder)

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents()

self.nameEdit=QLineEdit(self)

self.genderEdit=QLineEdit(self)

self.ageEdit=QLineEdit(self)

self.departmentEdit=QLineEdit(self)

nameLabel=QLabel(‘Name’,self)

genderLabel=QLabel(‘Gender’,self)

ageLabel=QLabel(‘Age’,self)

departmentLabel=QLabel(‘Department’,self)

insertButton=QPushButton(‘Insert’,self)

insertButton.clicked.connect(self.insertRecord)

hlayout=QHBoxLayout()

vlayout=QVBoxLayout(centralWidget)

vlayout.addWidget(self.tableView)

vlayout.addLayout(hlayout)

hlayout.addWidget(nameLabel)

hlayout.addWidget(self.nameEdit)

hlayout.addWidget(genderLabel)

hlayout.addWidget(self.genderEdit)

hlayout.addWidget(ageLabel)

hlayout.addWidget(self.ageEdit)

hlayout.addWidget(departmentLabel)

hlayout.addWidget(self.departmentEdit)

hlayout.addWidget(insertButton)

def insertRecord(self):

query=QSqlQuery(db)

query.prepare(‘INSERT INTO employee (name,gender,age,department) VALUES (?,?,?,?)’)

query.addBindValue(self.nameEdit.text())

query.addBindValue(self.genderEdit.text())

query.addBindValue(int(self.ageEdit.text()))

query.addBindValue(self.departmentEdit.text())

if not query.exec():

print(query.lastError().text())

self.model.select()

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个新的QWidget,并在其中添加了四个QLineEdit控件(分别用于输入员工姓名、性别、年龄和所属部门)、一个QPushButton控件(用于插入新的员工记录)。通过调用insertRecord函数,在将所有输入数据绑定到QSqlQuery对象后,将新条目插入到数据库中。

2. 实现数据删除

当我们单击删除按钮时,选择的员工记录将被删除。同时,表格中的数据也将刷新。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QWidget,QHBoxLayout,QVBoxLayout,QTableView,QLineEdit,QPushButton

from PyQt5.QtSql import QSqlDatabase,QSqlQuery,QSqlTableModel

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

centralWidget=QWidget(self)

self.setCentralWidget(centralWidget)

self.tableView=QTableView(self)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder)

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents()

self.nameEdit=QLineEdit(self)

self.genderEdit=QLineEdit(self)

self.ageEdit=QLineEdit(self)

self.departmentEdit=QLineEdit(self)

nameLabel=QLabel(‘Name’,self)

genderLabel=QLabel(‘Gender’,self)

ageLabel=QLabel(‘Age’,self)

departmentLabel=QLabel(‘Department’,self)

insertButton=QPushButton(‘Insert’,self)

insertButton.clicked.connect(self.insertRecord)

deleteButton=QPushButton(‘Delete’,self)

deleteButton.clicked.connect(self.deleteRecord)

hlayout=QHBoxLayout()

vlayout=QVBoxLayout(centralWidget)

vlayout.addWidget(self.tableView)

vlayout.addLayout(hlayout)

hlayout.addWidget(nameLabel)

hlayout.addWidget(self.nameEdit)

hlayout.addWidget(genderLabel)

hlayout.addWidget(self.genderEdit)

hlayout.addWidget(ageLabel)

hlayout.addWidget(self.ageEdit)

hlayout.addWidget(departmentLabel)

hlayout.addWidget(self.departmentEdit)

hlayout.addWidget(insertButton)

hlayout.addWidget(deleteButton)

def insertRecord(self):

query=QSqlQuery(db)

query.prepare(‘INSERT INTO employee (name,gender,age,department) VALUES (?,?,?,?)’)

query.addBindValue(self.nameEdit.text())

query.addBindValue(self.genderEdit.text())

query.addBindValue(int(self.ageEdit.text()))

query.addBindValue(self.departmentEdit.text())

if not query.exec():

print(query.lastError().text())

self.model.select()

def deleteRecord(self):

selected=self.tableView.selectedIndexes()

if len(selected)!=1:

return

row=selected[0].row()

self.model.removeRows(row,1)

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个新的QPushButton控件,用于从数据库中删除所选员工记录。我们使用QTableView.selectedIndexes()方法获取被选中的数据行,然后调用QSqlTableModel.removeRows()方法删除该记录。


数据运维技术 » Python PyQt实现数据库绑定功能 (pyqt 绑定数据库)