Podatkovne baze

Podatkovne baze so zanesljiv, skalabilen in praktičen način, kako hraniti podatke, ki jih nek program potrebuje. V praksi so datoteka ali več datotek na disku (ali na več diskih), ki ni običajno berljiva, ampak jo lahko spreminjamo s posebnimi programskimi paketi za določen jezik. Veliko baz podatkov je zgrajeno na sistemih, ki podpirajo operacije v jezku SQL, to je jezik za delo s podatki shranjenimi v relacijskih podatkovnih bazah.

Python ima za delo s podatkovnimi bazami modul sqlite, ki je eden izmed blj razširjenih implementacij podatkovnih baz, druge znane so še MySQL, PostgreSql, ...

Več o jeziku SQL in impementaciji SQLite si lahko preberete v poglavju Osnove SQL.

Za uporabo modula na začetek programa napišemo import sqlite3. Najprej se moramo vedno povezati z databazo, ki jo želimo uporabljati, to je datoteka, kjer imamo bazo shranjeno. Če te baze še ni, potem jo ustvari. Bazo lahko (za vajo) naredimo tudi kar v RAMu, tako da za datoteko damo argument :memory:.

Ko imamo enkrat povezavo vzpostvaljeno, si naredimo kazalec na našo bazo, in prek njega pošiljamo poizvedbe (querye) in dobivamo podatke. Primer:

connect(file)

Povežemo se z bazo podatkov shranjeno v datoteki file. Vrne Connection objekt.

class Connection
cursor()

Vrne kazalec na bazo podatkov s katerim lahko izvršimo ukaze.

close()

Zapre povezavo, po tem branje in pisanje v bazo ni več mogoče.

class Cursor
execute(query, vars)

Izvede query query na bazi, kjer ? v queryu zamena s spremenljivkami iz tupla vars, v takem vrtnem redu.

executemany(query, vars_iterable)

Izvede query query na bazi, kjer ? v queryu zamena s spremenljivkami iz seznama tuplov vars, v takem vrtnem redu, za vsak tuple svoj query.

execute(query)

Izvede query query na bazi.

fetchone()

Prebere in vrne en rezultat Row zadnjega querya.

fetchall()

Prebere in vrne vse rezulate zadnjega querya. Pozor, lahko jih je veliko!

SQLite nam rezultate vrne v razredu Row, ki se obnaša podobno kot dict ali tuple, podpira iteracijo, indekse ipd ...

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('SELECT * FROM ucenci WHERE ime=?', ('Janez',))
print(c.fetchone())

# Vstavimo več reči na enkrat.
novi_ucenci = [('1995-03-28', 'Janez', 'Novak', 1000, 5.00),
               ('1995-04-05', 'Mojca', 'Kranjc', 1000, 2.47),
               ('1995-09-06', 'Lara', 'Jazbec', 500, 3.97)]
c.executemany('INSERT INTO ucenci VALUES (?,?,?,?,?)', novi_ucenci)

Todo

Dodaj code injection warning.