InfoBook.ro ← Harta anului
Modul 08 · Python + baza de date
Modul 08 · Conținut 3.2 · limbaj

Python vorbește cu baza de date

SQL trăiește în interiorul programului: Python se conectează la bază, trimite comenzi prin cursor și primește rezultate. Împachetăm totul într-o clasă (POO din a XI-a) și învățăm regula de aur a banilor: tranzacțiile.

🎯 Obiectiv 1Folosești Connection și Cursor: execute, fetchall, commit, close.
🎯 Obiectiv 2Scrii cele patru operații CRUD, parametrizat (fără injecție SQL).
🎯 Obiectiv 3Garantezi consistența cu tranzacții: commit / rollback.
1

Fluxul: Connection → Cursor → execute → commit

Folosim modulul sqlite3 din biblioteca standard. Mereu aceiași cinci pași.

1import sqlite3
2con = sqlite3.connect("scoala.db") # 1. conexiunea
3cur = con.cursor() # 2. cursorul (execută comenzi)
4cur.execute("SELECT * FROM elevi") # 3. rulează SQL
5randuri = cur.fetchall() # 4. iau rezultatele
6for r in randuri:
7 print(r) # fiecare r e un tuplu
8con.close() # 5. închid conexiunea
fetchall vs fetchone: fetchall() aduce toate rândurile (o listă de tupluri), fetchone() doar următorul rând. Pentru SELECT nu ai nevoie de commit; pentru INSERT/UPDATE/DELETE, DA.
2

CRUD parametrizat — cele patru operații

Create, Read, Update, Delete. Valorile se trimit prin ?, NU lipite în text — altfel apare injecția SQL.

1# CREATE — insert parametrizat
2cur.execute("INSERT INTO elevi (nume, media) VALUES (?, ?)", (nume, media))
3# READ
4cur.execute("SELECT * FROM elevi WHERE media >= ?", (9,))
5# UPDATE
6cur.execute("UPDATE elevi SET media = ? WHERE id = ?", (10, 3))
7# DELETE
8cur.execute("DELETE FROM elevi WHERE id = ?", (5,))
9con.commit() # salvează modificările pe disc
De ce ? și nu lipire de text: dacă scrii "... WHERE nume = '" + x + "'", iar cineva pune x = "'; DROP TABLE elevi; --", îți șterge tabela. Parametrii ? tratează valoarea ca DATE, nu ca și cod — asta e protecția împotriva injecției SQL.
3

Împachetat în clasă — DatabaseManager

POO din clasa a XI-a (M12) își găsește un scop real: ascundem conexiunea și cursorul într-o clasă, cu metode curate.

1class DatabaseManager:
2 def __init__(self, fisier): # constructorul (XI·M12)
3 self.con = sqlite3.connect(fisier)
4 self.cur = self.con.cursor()
5 def adauga_elev(self, nume, media):
6 self.cur.execute("INSERT INTO elevi (nume, media) VALUES (?, ?)", (nume, media))
7 self.con.commit()
8 def toti_elevii(self):
9 self.cur.execute("SELECT * FROM elevi")
10 return self.cur.fetchall()
11
12db = DatabaseManager("scoala.db")
13db.adauga_elev("Ana", 9.5)
14print(db.toti_elevii())
Câștigul POO: restul programului nu mai vede SQL — apelează doar db.adauga_elev(...). Detaliile (conexiune, cursor, commit) sunt ascunse în clasă (încapsulare).
4

Tranzacții — totul sau nimic

Un transfer bancar = două operații (scad din A, adaug în B). Dacă a doua eșuează, prima NU trebuie să rămână. Tranzacția garantează asta: commit confirmă tot, rollback anulează tot.

cont A
100
cont B
50
transfer A → B:
alege o sumă și încearcă cele două scenarii 👆
1try:
2 cur.execute("UPDATE conturi SET sold = sold - ? WHERE id = 'A'", (s,))
3 cur.execute("UPDATE conturi SET sold = sold + ? WHERE id = 'B'", (s,))
4 con.commit() # ambele reușesc → confirmă
5except:
6 con.rollback() # ceva a eșuat → anulează TOT
5

Verificare rapidă

Șase întrebări despre Python + baza de date.

6

Fișa de sinteză

Python + BD, condensat.

Flux: connect() → cursor() → execute() → fetchall() → commit() → close().
SELECT nu cere commit; INSERT/UPDATE/DELETE da.
Parametrizat cu ?: valorile prin tuplu, niciodată lipite în text (injecție SQL).
DatabaseManager (POO): ascunde conexiunea/cursorul în metode curate.
Tranzacție: commit confirmă tot; rollback anulează tot (totul sau nimic).
fetchall = toate rândurile (listă de tupluri); fetchone = unul.
← anteriorModul 07 · DML & DDL urmează →Modul 09 · Ce înseamnă „a învăța"