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()方法删除该记录。