RkBlog

Hardware, programming and astronomy tutorials and reviews.

QtSql w PyQt - dostęp do baz danych

Opis klas PyQt4 zapewniających dostęp do baz danych i wyświetlanie danych w gridach.

W Qt/PyQt mamy dostęp do modułu QtSql zapewniającego dostęp do popularnych baz danych, w tym także widżety do wyświetlania danych (gridy). Lista obsługiwanych baz danych zależy od ustawień w czasie kompilacji Qt. W przypadku pakiety PyQt4 dla MS Windows dostępne tylko są sterowniki do SQLite i ODBC. By móc korzystać z baz MySQL, czy PostgreSQL należałoby skompilować Qt z obsługą tych baz danych, a następnie PyQt4. Pod Linuksem i podobnymi systemami problemów z brakującymi sterownikami nie ma. Jeżeli nie zależy nam na szczególnych opcjach modułu QtSql możemy używać standardowych bibliotek Pythona zapewniających dostęp do baz danych.

Poniżej przedstawiono prosty przykład wykonywania zapytań SQL za pomocą QtSql:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *

app = QApplication(sys.argv)
w = QTextBrowser()

# DB type, host, user, password...
db = QSqlDatabase.addDatabase("QMYSQL");
db.setHostName("localhost")
db.setDatabaseName("test")
db.setUserName("root")
db.setPassword("")
ok = db.open()

# True if connected
if ok:
	w.insertHtml('Connected to MySQL<br />')
else:
	w.insertHtml('ERROR connecting to MySQL<br />')

# do a query "on" a DB connection
query = QSqlQuery(db)
if query.exec_("SHOW TABLES"):
	w.insertHtml('<br />')
	while query.next():
		table = query.value(0).toString()
		w.insertHtml('%s<br />' % table)
	
	w.insertHtml('<br />')
	w.insertHtml('TOTAL %s TABLES' % query.size())

w.show()
sys.exit(app.exec_())
Początek to wybranie typu bazy danych (sterownika) za pomocą klasy QSqlDatabase. Po nawiązaniu połączenia można wykonywać zapytania za pomocą klasy QSqlQuery, która jako argument przyjmuje obiekt połączenia. Obsługuje ona wszystkie typy zapytań (pobieranie danych, jak i pozostałe - dodanie/edycja/usuwanie). Klasa ta zwróci wartość "True" jeżeli zapytanie się powiedzie. W przypadku pobierania danych obiekt QSqlQuery będzie zawierał listę wyników wskazując na pierwszy rekord. By przejść do następnego należy skorzystać z metody "next":
while x:
	table = query.value(0).toString()
Metoda next() przesuwa wskaźnik na kolejny rekord i zwraca "True", lub też "False" jeżeli kolejny rekord nie jest dostępny. Dostęp do danego rekordu mamy za pomocą metody value(), która jako argument przyjmuje indeks (numerowany od zera) pobranego pola.
RkBlog

12 December 2008;

Comment article