Ce face SQLite din Python (sqlite3)
Python are SQLite inclus: import sqlite3 merge fără nicio instalare. sqlite3.connect("magazin.db") deschide (sau creează) fișierul, iar con.execute(sql, parametri) rulează o instrucțiune și întoarce un cursor din care citești rândurile cu fetchone(), fetchall() sau direct într-un for.
Valorile nu se lipesc niciodată în textul SQL: pui ? în interogare și le dai separat, ca tuplu (("Iași",)) sau cu nume (:oras și un dicționar). Așa eviți SQL injection și problemele cu apostrofuri, ca în „O’Brien”.
Modulul deschide singur o tranzacție înaintea primului INSERT/UPDATE/DELETE; modificările se salvează abia la con.commit(). Folosit ca with con:, blocul face commit() la final sau rollback() la excepție (dar nu închide conexiunea). Mai multe despre limbaj găsești în secțiunea Python.
Parametri
| Parametru | Descriere |
|---|---|
connect(cale) |
Deschide baza; ":memory:" creează una în memorie. |
execute(sql, parametri) |
Rulează o instrucțiune cu valori pentru ? sau :nume. |
executemany(sql, lista) |
Rulează aceeași instrucțiune pentru fiecare set de valori. |
row_factory |
Setează sqlite3.Row ca să accesezi coloanele după nume. |
Exemple
Exemplul 1: Tabel, inserare cu parametri și citire
executemany inserează toate rândurile cu o singură instrucțiune pregătită; with con: face commit() la final.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE produse (nume TEXT, pret INTEGER, stoc INTEGER)")
produse = [("Caiet", 12, 200), ("Pix", 5, 500), ("Birou", 800, 3)]
with con:
con.executemany("INSERT INTO produse VALUES (?, ?, ?)", produse)
for nume, pret in con.execute("SELECT nume, pret FROM produse WHERE pret < ? ORDER BY pret", (100,)):
print(f"{nume}: {pret} lei")
print("Total produse:", con.execute("SELECT count(*) FROM produse").fetchone()[0])
con.close()
Rezultat în Python
Pix: 5 lei
Caiet: 12 lei
Total produse: 3
Exemplul 2: Rânduri accesate după numele coloanei
Cu row_factory = sqlite3.Row, fiecare rând se comportă ca un dicționar. Parametrii cu nume (:oras) primesc valorile dintr-un dicționar.
import sqlite3
con = sqlite3.connect(":memory:")
con.row_factory = sqlite3.Row
con.execute("CREATE TABLE clienti (nume TEXT, oras TEXT)")
con.executemany("INSERT INTO clienti VALUES (:nume, :oras)", [
{"nume": "Ana", "oras": "Iași"},
{"nume": "Mihai", "oras": "Cluj"},
{"nume": "Elena", "oras": "Iași"},
])
for rand in con.execute("SELECT * FROM clienti WHERE oras = :oras ORDER BY nume", {"oras": "Iași"}):
print(rand["nume"], "locuiește în", rand["oras"])
print(sqlite3.sqlite_version)
Rezultat în Python
Ana locuiește în Iași
Elena locuiește în Iași
3.54.1
Exemplul 3: Rollback automat la eroare
A doua actualizare încalcă CHECK; excepția oprește blocul with, care anulează și prima actualizare. Soldurile rămân cele inițiale.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE conturi (titular TEXT PRIMARY KEY, sold INTEGER CHECK (sold >= 0))")
with con:
con.executemany("INSERT INTO conturi VALUES (?, ?)", [("Ana", 500), ("Mihai", 100)])
try:
with con:
con.execute("UPDATE conturi SET sold = sold + 300 WHERE titular = 'Ana'")
con.execute("UPDATE conturi SET sold = sold - 300 WHERE titular = 'Mihai'")
except sqlite3.IntegrityError as e:
print("Transfer anulat:", e)
print(con.execute("SELECT * FROM conturi ORDER BY titular").fetchall())
Rezultat în Python
Transfer anulat: CHECK constraint failed: sold >= 0
[('Ana', 500), ('Mihai', 100)]
Greșeli frecvente
- Construiești interogarea cu f-string:
f"... WHERE nume = '{nume}'". Un nume cu apostrof strică interogarea, iar un text ales de un atacator poate rula alt SQL. Folosește mereu?. - Uiți
con.commit()(sau bloculwith con:). Datele par salvate în program, dar dispar la închidere. - Dai un singur parametru ca
("Iași"). Fără virgulă nu este tuplu, ci un șir, și primești o eroare despre numărul de parametri; scrie("Iași",). - Crezi că
with con:închide conexiunea. Doar confirmă sau anulează tranzacția; închiderea o faci cucon.close().
Comenzi înrudite
BEGIN, COMMIT, ROLLBACK: Grupează mai multe modificări într-o tranzacție: fie se salvează toate cu COMMIT, fie niciuna cu ROLLBACK.SAVEPOINT: Pune un punct de revenire în interiorul unei tranzacții: poți anula doar modificările de după el, fără să pierzi tot.PRAGMA foreign_keys: Pornește verificarea cheilor străine. În SQLite este oprită implicit și trebuie pornită la fiecare conexiune.FTS5 (căutare full-text): Căutare rapidă după cuvinte în texte lungi, cu ordonare după relevanță, evidențiere, prefixe și fraze, direct în SQLite.