SQLite din Python (sqlite3) în SQLite

SQLite din alte limbaje Python 2.5 (modulul sqlite3)

Modulul sqlite3 din biblioteca standard Python: conectare, interogări cu parametri, tranzacții și rânduri ca dicționare.

Sintaxă
import sqlite3
con = sqlite3.connect("fisier.db")
con.execute("SQL cu ?", (valoare,))
con.commit()
con.close()

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 blocul with 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 cu con.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.