Modul 12 · Python for SDETs
API uğur dedi —
amma saxladımı?
Capstone-un üstündəki senior addım: sadəcə cavabı yox, davam edən yan təsiri yoxla
yalnız-oxu
sqlite3 — stdlib
JOIN
qeyd
201 tətbiqin sözüdür — sətir isə qeyddir
Tətbiqin BİLDİRDİYİ
201 Created
{ "id": 7, "total": 59.98 }
💬Cavab tətbiqin sözüdür: "qəbul etdim."
Tətbiqin SAXLADIĞI
# orders
id=7 · status=pending · total=59.98
# order_items
order_id=7 · product_id=1 · qty=2
🗄️Verilənlər bazası sətri qeyddir: "saxlanılan budur."
Hər yerdə təkrar işlətdiyin şablon
API vasitəsilə hazırla & icra et → DB vasitəsilə yoxla
reset_db
→
api.post("/api/orders")
→
db.execute("SELECT …")
→
davam etdi ✓
yazılar tətbiq vasitəsilə gedir
DB sənin yalnız-oxu yoxlama qatındır
🔒Qoy tətbiq öz yazılarına sahib olsun — onun qaydaları və hesablanmış sütunları işləyir. Sən təsiri təsdiqləmək üçün yalnız oxuyursan, ona görə test tətbiqin verilənlərini heç vaxt korlaya bilməz.
Onu yalnız-oxu aç, dəyərləri ? kimi ötür
import sqlite3
con = sqlite3.connect(
f"file:{DB_PATH.as_posix()}?mode=ro", uri=True)
con.row_factory = sqlite3.Row
row = con.execute(
"SELECT id, name, stock FROM products"
" WHERE slug = ?", ("wireless-mouse",),
).fetchone()
🛡️mode=ro yazmağı qeyri-mümkün edir — səhvən yazılmış sorğu tətbiqin verilənlərini korlaya bilməz. INSERT OperationalError atır.
💉Dəyər ? parametr kimi daxil olur, SQL sətrinə heç vaxt yapışdırılmır. Yeganə güzəştsiz vərdiş.
📦sqlite3 standart kitabxanadadır — sıfır quraşdırma.
201 = qəbul edildi · sətir = saxlanıldı · JOIN = düzgün saxlanıldı
Valideyn — orders sətri
order = db.execute(
"SELECT status, total FROM orders"
" WHERE id = ?", (order_id,)).fetchone()
assert order is not None
assert order["status"] == "pending"
assert order["total"] == pytest.approx(59.98)
Övladlar — JOIN vasitəsilə order_items
items = db.execute(
"""SELECT oi.product_id, oi.quantity
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
WHERE o.id = ?"""
, (order_id,)).fetchall()
assert [(i["product_id"], i["quantity"]) for i in items] == [(1, 2)]
API-nin qaytarmayacağına çat
# the API never hands the password back — rightly
row = db.execute(
"SELECT password FROM users WHERE email = ?",
("customer@test.io",)).fetchone()
stored = row["password"]
assert stored != "customer123"
assert stored.startswith("$2")
assert len(stored) == 60
🔑"Parol açıq mətnlə yox, hash-lənmiş saxlanılırmı?" xaricdən cavablana bilməz…
🔎…və içəridən bir SELECT uzaqlıqdadır. Bəzi həqiqətlər yalnız sxemdə yaşayır.
Eyni ideya, işdə
SQLite → istehsal: şablonu yox, sürücünü dəyiş
sqlite3
→
psycopg
·
PyMySQL
|
?
→
%s
|
fayl yolu
→
bağlantı sətri
qoşul → parametrləşdir → yoxla → bağla
🧭Yazdığın SQL (SELECT, WHERE, JOIN) standartdır və Postgres NUMERIC-i sadəcə Decimal kimi gəlir. Konteyner bir docker run-dan — və ya CI servis konteynerindən gəlir.
🗄️
Qeydi
yoxlaya bilərsən
Cavab, UI — və API-nin üstündə oturduğu davam edən həqiqət
🛡️
İndi bacarırsan
Yalnız-oxu bağlantı, parametrləşdirilmiş sorğu və saxlandığını sübut edən JOIN
🧭
İşdə
Bu gün SQLite, sabah Postgres — eyni dörd addım, yalnız sürücü dəyişir
🧩
Onu bərkit
Capstone-una DB yoxlaması əlavə et — "onun həqiqətən saxlandığını haradan bilirsən?"