PyQt - Xử lý cơ sở dữ liệu
API PyQt chứa một hệ thống lớp phức tạp để giao tiếp với nhiều cơ sở dữ liệu dựa trên SQL. QSqlDatabase của nó cung cấp quyền truy cập thông qua một đối tượng Connection. Sau đây là danh sách các trình điều khiển SQL hiện có sẵn:
Sr.No. | Loại & Mô tả Trình điều khiển |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Trình điều khiển Borland InterBase |
3 | QMYSQL Trình điều khiển MySQL |
4 | QOCI Trình điều khiển giao diện cuộc gọi Oracle |
5 | QODBC Trình điều khiển ODBC (bao gồm Microsoft SQL Server) |
6 | QPSQL Trình điều khiển PostgreSQL |
7 | QSQLITE SQLite phiên bản 3 trở lên |
số 8 | QSQLITE2 SQLite phiên bản 2 |
Thí dụ
Kết nối với cơ sở dữ liệu SQLite được thiết lập bằng phương pháp tĩnh -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
Các phương thức khác của lớp QSqlDatabase như sau:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 |
setDatabaseName() Đặt tên của cơ sở dữ liệu mà kết nối được tìm kiếm |
2 |
setHostName() Đặt tên của máy chủ lưu trữ mà cơ sở dữ liệu được cài đặt |
3 |
setUserName() Chỉ định tên người dùng cho kết nối |
4 |
setPassword() Đặt mật khẩu của đối tượng kết nối nếu có |
5 |
commit() Cam kết các giao dịch và trả về đúng sự thật nếu thành công |
6 |
rollback() Cuộn lại giao dịch cơ sở dữ liệu |
7 |
close() Đóng kết nối |
Lớp QSqlQuery có chức năng thực thi và thao tác các lệnh SQL. Cả hai kiểu truy vấn SQL DDL và DML đều có thể được thực thi. Phương thức quan trọng nhất trong lớp là execute_ (), phương thức này nhận làm đối số là một chuỗi chứa câu lệnh SQL được thực thi.
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key,
" "firstname varchar(20), lastname varchar(20))")
Tập lệnh sau tạo cơ sở dữ liệu SQLite sports.db với một bảng vận động viên điền vào năm bản ghi.
from PyQt4 import QtSql, QtGui
def createDB():
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
if not db.open():
QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
QtGui.qApp.tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information "
"how to build it.\n\n" "Click Cancel to exit."),
QtGui.QMessageBox.Cancel)
return False
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, "
"firstname varchar(20), lastname varchar(20))")
query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
return True
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
createDB()
Lớp QSqlTableModel trong PyQt là một giao diện cấp cao cung cấp mô hình dữ liệu có thể chỉnh sửa để đọc và ghi các bản ghi trong một bảng. Mô hình này được sử dụng để điền một đối tượng QTableView. Nó trình bày cho người dùng một chế độ xem có thể cuộn và chỉnh sửa được có thể được đặt trên bất kỳ cửa sổ cấp cao nhất nào.
Đối tượng QTableModel được khai báo theo cách sau:
model = QtSql.QSqlTableModel()
Chiến lược chỉnh sửa của nó có thể được đặt thành bất kỳ điều nào sau đây:
QSqlTableModel.OnFieldChange | Mọi thay đổi sẽ được áp dụng ngay lập tức |
QSqlTableModel.OnRowChange | Các thay đổi sẽ được áp dụng khi người dùng chọn một hàng khác |
QSqlTableModel.OnManualSubmit | Tất cả các thay đổi sẽ được lưu vào bộ nhớ cache cho đến khi submitAll () hoặc revertAll () được gọi |
Thí dụ
Trong ví dụ sau, bảng vận động viên được sử dụng làm mô hình và chiến lược được đặt là:
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
Lớp QTableView là một phần của khuôn khổ Model / View trong PyQt. Đối tượng QTableView được tạo như sau:
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
Đối tượng QTableView này và hai widget QPushButton được thêm vào cửa sổ QDialog cấp cao nhất. Tín hiệu clicked () của nút add được kết nối với addrow () thực hiện insertRow () trên bảng mô hình.
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
Vị trí được liên kết với nút xóa thực hiện một hàm lambda để xóa một hàng, được người dùng chọn.
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
Mã hoàn chỉnh như sau:
import sys
from PyQt4 import QtCore, QtGui, QtSql
import sportsconnection
def initializeModel(model):
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")
def createView(title, model):
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
def findrow(i):
delrow = i.row()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
model = QtSql.QSqlTableModel()
delrow = -1
initializeModel(model)
view1 = createView("Table Model (View 1)", model)
view1.clicked.connect(findrow)
dlg = QtGui.QDialog()
layout = QtGui.QVBoxLayout()
layout.addWidget(view1)
button = QtGui.QPushButton("Add a row")
button.clicked.connect(addrow)
layout.addWidget(button)
btn1 = QtGui.QPushButton("del a row")
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
layout.addWidget(btn1)
dlg.setLayout(layout)
dlg.setWindowTitle("Database Demo")
dlg.show()
sys.exit(app.exec_())
Đoạn mã trên tạo ra kết quả sau: