SELECT
in ostalimi stavki v SQL?
Potrebovali bomo sledeče:
import MySQLdb # za MySQL
import sqlite3 # za SQLite - vgrajena v Python
import psycopg2 # za PostgreSQL
import sqlite3 as dbapi # in potem delamo kar z dbapi
povezava = dbapi.connect(povezovalni_niz)
kazalec = povezava.cursor()
kazalec.execute(ustrezen_ukaz_SQL)
kazalec.fetchall()
, kazalec.fetchone()
, kazalec.fetchmany(število)
bbc.db
.Izpišimo imena vseh evropskih držav.
import sqlite3 as dbapi
povezava = dbapi.connect("bbc.db")
kazalec = povezava.cursor()
sql = "SELECT * FROM bbc WHERE region = 'Europe'"
kazalec.execute(sql) # izvedemo ukaz
zapisi = kazalec.fetchall() # preberemo tabelo z rezultati
for vrstica in zapisi:
print(vrstica[0]) # ime je prvi element nabora
kazalec.close()
povezava.close()
import sqlite3 as dbapi
# Povežemo se na novo bazo - s tem jo ustvarimo
conn = dbapi.connect("testdb.sqlite")
cur = conn.cursor() # Odpremo kazalec
cur.execute("DROP TABLE IF EXISTS test;") # Zbrišemo tabelo, če že obstaja
# Izvedemo ukaz - ustvarimo tabelo
cur.execute("""
CREATE TABLE test (
id integer PRIMARY KEY AUTOINCREMENT,
num integer,
data text
);
""")
# Vstavimo podatke v tabelo
cur.execute("INSERT INTO test (num, data) VALUES (100, 'KU-KU');")
cur.execute("SELECT * FROM test;") # Preberemo zapisane podatke
rezultat = cur.fetchone() # Hočemo le eno vrstico
print(rezultat) # Izpiše se (1, 100, "KU-KU")
conn.commit() # Poskrbimo, da so spremembe trajne
# Zapremo povezave z bazo
cur.close()
conn.close()
with
with
:
with open('datoteka.txt') as f:
# delamo z datoteko
with
podamo povezavo na bazo, bo ob uspešnem dokončanju potrdil transakcijo, sicer jo bo pa preklical:
import sqlite3 as dbapi
conn = dbapi.connect("testdb.sqlite")
cur = conn.cursor()
try:
with conn:
cur.execute("""
INSERT INTO test (id, num, data)
VALUES (1, 200, 'kaj pa zdaj?');
""")
except dbapi.IntegrityError as ex:
print(f"Napaka: {ex}")
</span>
?
, vrednosti pa podamo s seznamom (ali naborom) kot drugi argument metode execute
.
cur.execute("SELECT * FROM bbc WHERE name = ?;", ('Slovenia', ))
cur.execute("""
SELECT * FROM bbc
WHERE population BETWEEN ? AND ?;
""", [min, max])
cur.execute("SELECT * FROM bbc WHERE name = :ime;", {'ime': 'Slovenia'})
cur.execute("""
SELECT * FROM bbc
WHERE population >= :vrednost AND
area >= :vrednost;
""", {'vrednost': vrednost})
</span>
cur.execute(f"""
SELECT id, admin FROM uporabnik
WHERE uporabnisko_ime = '{uporabnisko_ime}' AND
geslo = '{geslo}';
""")
uporabnisko_ime = "admin' OR 0 AND --"
geslo = ""
SELECT id, admin FROM uporabnik
WHERE uporabnisko_ime = 'admin' OR 0 AND --' AND
geslo = '';
</span>
f
-nizov, metod format
in join
, operatorjev %
in +
, …Namesto tega naj za vstavljanje poskrbi podatkovni vmesnik.
execute
lahko izvajamo samo en ukaz SQL.
;
), dobimo napako.executemany
večkrat izvedemo en ukaz SQL z različnimi podatki.
cur.executemany(sql, podatki)
for nabor in podatki:
cur.execute(sql, nabor)
executescript
lahko izvajamo več ukazov SQL (ločeni s ;
).
CREATE TABLE tabela (
id integer PRIMARY KEY AUTOINCREMENT,
stolpec text ...
);
cur.execute("INSERT INTO tabela (stolpec) VALUES (?);", [vrednost])
cur.lastrowid
.
rowid
(če ne zahtevamo drugače).csv
, npr.
import csv
with open("nobel.csv") as f:
rd = csv.reader(f)
next(rd) # izpustimo prvo vrstico z naslovi stolpcev
for vrstica in rd:
# obdelamo vrstico - shranimo, uvozimo v bazo, ...
Pri pisanju aplikacij kodo organiziramo po shemi MVC.