Tavs šīs stundas izaicinājums: Savienot Python kodu ar PostgreSQL datubāzi un izpildīt drošus parametrizētus vaicājumus.
psycopg2 ir Python bibliotēka, kas savieno tavu kodu ar PostgreSQL datubāzi. Instalācija: pip install psycopg2-binary.
import psycopg2
conn = psycopg2.connect(
host="localhost",
database="spele",
user="postgres",
password="tavs_parole"
)
cur = conn.cursor()
# DROŠA parametrizēta vaicājuma forma — %s ir TIKAI vietturis
cur.execute("SELECT * FROM speletaji WHERE punkti > %s", (100,))
for rinda in cur.fetchall():
print(rinda)
conn.commit() # apstiprina izmaiņas
cur.close()
conn.close()
⚠ DROŠĪBA: NEKAD nelieto string formatēšanu (f"...{x}...") SQL vaicājumos — tas ir SQL injekcijas uzbrukums!
Pārbaudi, ka Python var pieslēgties datubāzei.
pip install psycopg2-binarydb_test.py: importē psycopg2, savienojas, izpilda SELECT NOW(), izvada laiku..env failu paroles glabāšanai (NEPUSH GitHub-ā!)..env savam .gitignore failam.Ieprogrammē funkcijas datu pievienošanai un nolasīšanai.
pievienot_speletaju(vards) — INSERT ar parametriem un RETURNING id.iegut_visus() — SELECT un atgriež sarakstu.atjauninat_punktus(id, jaunie) — UPDATE ar WHERE.dzest_speletaju(id) — DELETE ar WHERE.Demonstrē transakcijas un drošību pret SQL injekciju.
'); DROP TABLE speletaji; --. Vai ar parametriem tas nodara skādi? (Nē — drošs!)commit() piesauc raise Exception().conn.rollback() — pārbaudi datubāzi, vai izmaiņas atcēlās.with conn: kontekstu — automātiska commit/rollback.Atgriež rezultātus kā vārdnīcas, nevis kā kortežus.
from psycopg2.extras import RealDictCursorcur = conn.cursor(cursor_factory=RealDictCursor)cur.fetchall() atgriež [{'id': 1, 'vards': 'Anna', ...}, ...]f"WHERE id = {user_id}" — vienmēr %s + parametru tuple.with bloku vai try/finally — savienojumi jāatbrīvo.import psycopg2
from psycopg2.extras import RealDictCursor
with psycopg2.connect(
host="localhost", database="spele",
user="postgres", password="parole"
) as conn:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
# DROŠA INSERT
cur.execute(
"INSERT INTO speletaji (vards) VALUES (%s) RETURNING id",
("Anna",)
)
jauns_id = cur.fetchone()["id"]
print(f"Pievienots ar id = {jauns_id}")
cur.execute("SELECT * FROM speletaji ORDER BY id DESC LIMIT 3")
for r in cur.fetchall():
print(r["vards"], r["punkti"])