2024-05-19 02:42:39
  • Hello!
  • Whats ya doin?
  • ByeBye

[&]

18.220.233.242

Połączenie z bazą danych

workshop: #19-dbases.html

Połączenie z bazą danych

Przygotowanie

  1. Wgraj do katalogu projektu 19-dbase plik bazy SQLite zse-ad.db

  2. Upewnij się, że masz dostęp do bazy danych MySQL

  3. Warto posiadać program do przeglądania plików SQLite, np. DB Browser for SQLite

1 Zadanie do wykonania

Rozwiń poprzednio tworzoną aplikację o funkcjonalności Listy oraz obsługi Bazy danych

Wizualizacja aplikacji

  • PC-1
  • PC-2 [RR]
  • PC-3
  • PC-4 [MK]
  • PC-5 [GP]
  • PC-6 [MO]
Centralna
część
aplikacji
Status / komunikaty
  • Przygotuj listę QListWidget() na lewym bocznym panelu aplikacji

  • Lista ma być uzupełniana spisem komputerów od 1-12 przy użyciu QListWidgetItem()

  • Po połączeniu z bazą danych lista ma być uzupełniana Studentami przypisanymi do Komputerów

  • Aby przypisać Studenta do Komputera możesz użyć pola logTry w tabeli cmsUsers

  • Wybór komputera/studenta z listy powinien być zapamiętywany i zaznaczonay na liście

  • Po wybraniu elementu z listy można wywoływać polecenia z paska narzędziowego (Start, Shutdown itd.)

  • Akcja po wybraniu jednego z 4 przycisków ma uaktualniać tekst statusu u dołu aplikacji

  • Przyszłe lekcje: Przypisanie Studenta do Komputera

  • Przyszłe lekcje: Wybór bazy danych oraz pola wprowadzania loginu i hasła

2 Obsługa widgetu Listy

QListWidget() - kontener listy, odpowiednik UL z HTML'a

QListWidgetItem( "Nazwa etykiety" ) - element listy, odpowiednik LI z HTML'a

QListWidget.addItem( QListWidgetItem ) - dodanie elementu do listy

QListWidget.itemClicked.connect( funkcja_obsługi ) - funkcja obsługujaca zdarzenie ekliknięcia elementu listy

QListWidget.selectedItems()[0].text()) - odczytanie etykiety tekstowej klikniętego elementu listy

3 Nawiązanie połączenia z plikiem bazy SQLite

Aby połączyć się z plikową bazą SQLite należy wykonać poniższe kroki:

  • zainstalować (jeżeli trzeba) i zaimportować bibliotekę sqlite do projektu

  • wgrać plik z bazą SQLite do katalogu projektu

  • nawiązać połączenie z plikiem sqlite3.connect( plik )

  • [opcjonalnie] zmienić sposób przetwarzania wierszy (wyników) *.row_factory

  • wyzerować kursor (iterator po wynikach) *.cursor()

  • wywołać zapytanie poprzez kursor

  • wydobyć z kursora wyniki zapytania

  • iterować w pętli przez wydobyte z kursora wiersze

  • wykonać operacje na danych zgodnie z projektem

  • zatwierdzić (zakończyć) połączenie oraz zamknąć połączenie z plikiem

import sqlite3
dbFile	= 'zse-ad.db'
dbTable	= 'cmsUsers'

Metoda łączenia z bazą

def dbcFile(self):
  con = sqlite3.connect( dbFile )
  con.row_factory = self.resultAsDict	# ten wiersz odpowiada za konwersję wyników
  cur = con.cursor()
  cur.execute("SELECT * FROM "+dbTable)
  res = cur.fetchall()
  for row in res:
  # wyniki w tablicy indeksowanej numerycznie
    print(row[6]+" "+row[7])
  # wyniki po konwersji przez mechanizm row_factory
    print(row['surname']+" "+row['name'])
  con.commit()
  con.close()

Z racji prostych mechanizmów zaimplementowanych w silniku bazy SQLite, aby przetwarzać wyniki zapytania SELECT jako tablicę asocjacyjną (słownik) należy zaimplementować funkcję konwertującą tablicę indeksowaną numerycznie na asocjacyjną.

def resultAsDict(self, cursor, row):
  d = {}
  for i, col in enumerate(cursor.description):
    d[col[0]] = row[i]
  return d
4 Nawiązanie połączenia z bazą danych MySQL

Aby połączyć się z plikową bazą MySQL / MariaDB należy wykonać poniższe kroki:

  • zainstalować bibliotekę python3 -m pip install mysql-connector-python

  • zaimportować bibliotekę mysql.connector do projektu

  • wewnątrz mechanizmu try: except ?: nawiązać połączenie z bazą with connect( CREDENTIALS )

import mysql.connector
from mysql.connector import connect, Error
dbHost	= 'localhost'
dbUser	= 'wpisz'
dbPass	= 'wpisz'
dbBase	= 'cmsUsers'

Metoda łączenia z bazą

def dbcSrv(self):
  try:
    with connect( host= dbHost,	user= dbUser, password= dbPass,	database= dbBase ) as connection:
      print(connection)
  except Error as e:
    print(e)

Podsumowanie

  1. Aplikacja będzie rozwijana na następnej lekcji - wtedy zostanie oceniona.