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 -