PyQt - Veritabanı Yönetimi
PyQt API, birçok SQL tabanlı veritabanıyla iletişim kurmak için ayrıntılı bir sınıf sistemi içerir. QSqlDatabase, bir Connection nesnesi aracılığıyla erişim sağlar. Şu anda mevcut SQL sürücülerinin listesi aşağıdadır -
Sr.No. | Sürücü Tipi ve Açıklaması |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Borland InterBase Sürücüsü |
3 | QMYSQL MySQL Sürücüsü |
4 | QOCI Oracle Çağrı Arabirimi Sürücüsü |
5 | QODBC ODBC Sürücüsü (Microsoft SQL Server içerir) |
6 | QPSQL PostgreSQL Sürücüsü |
7 | QSQLITE SQLite sürüm 3 veya üstü |
8 | QSQLITE2 SQLite sürüm 2 |
Misal
Statik yöntem kullanılarak bir SQLite veritabanıyla bağlantı kurulur -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
QSqlDatabase sınıfının diğer yöntemleri aşağıdaki gibidir -
Sr.No. | Yöntemler ve Açıklama |
---|---|
1 | setDatabaseName() Bağlantının arandığı veritabanının adını belirler. |
2 | setHostName() Veritabanının kurulu olduğu ana bilgisayarın adını belirler |
3 | setUserName() Bağlantı için kullanıcı adını belirtir |
4 | setPassword() Varsa bağlantı nesnesinin parolasını ayarlar |
5 | commit() İşlemleri tamamlar ve başarılı olursa doğru döndürür |
6 | rollback() Veritabanı işlemini geri alır |
7 | close() Bağlantıyı kapatır |
QSqlQuery sınıfı, SQL komutlarını yürütmek ve işlemek için işlevselliğe sahiptir. Hem DDL hem de DML tipi SQL sorguları çalıştırılabilir. Sınıftaki en önemli yöntem, yürütülecek SQL ifadesini içeren bir dizeyi bağımsız değişken olarak alan exec_ () yöntemidir.
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key,
" "firstname varchar(20), lastname varchar(20))")
Aşağıdaki komut dosyası, beş kayıtla doldurulmuş bir sporcu tablosu içeren bir SQLite veritabanı sports.db oluşturur.
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()
PyQt'daki QSqlTableModel sınıfı, tek bir tablodaki kayıtları okumak ve yazmak için düzenlenebilir veri modeli sağlayan üst düzey bir arayüzdür. Bu model, bir QTableView nesnesini doldurmak için kullanılır. Kullanıcıya herhangi bir üst düzey pencereye yerleştirilebilen kaydırılabilir ve düzenlenebilir bir görünüm sunar.
Bir QTableModel nesnesi aşağıdaki şekilde bildirilir -
model = QtSql.QSqlTableModel()
Düzenleme stratejisi aşağıdakilerden herhangi birine ayarlanabilir -
QSqlTableModel.OnFieldChange | Tüm değişiklikler hemen uygulanacaktır |
QSqlTableModel.OnRowChange | Kullanıcı farklı bir satır seçtiğinde değişiklikler uygulanacak |
QSqlTableModel.OnManualSubmit | Tüm değişiklikler, submitAll () veya revertAll () çağrılana kadar önbelleğe alınacaktır. |
Misal
Aşağıdaki örnekte sporcu masası bir model olarak kullanılmış ve strateji şu şekilde ayarlanmıştır -
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
QTableView sınıfı, PyQt'daki Model / Görünüm çerçevesinin bir parçasıdır. QTableView nesnesi aşağıdaki gibi oluşturulur -
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
Bu QTableView nesnesi ve iki QPushButton parçacığı, en üst düzey QDialog penceresine eklenir. Ekle düğmesinin () sinyali, model tablosunda insertRow () işlemini gerçekleştiren addrow () 'a bağlanır.
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
Silme düğmesiyle ilişkili Yuva, kullanıcı tarafından seçilen bir satırı silen bir lambda işlevini yürütür.
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
Kodun tamamı aşağıdaki gibidir -
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_())
Yukarıdaki kod aşağıdaki çıktıyı üretir -