Lesson 4 — Beginner

Data & Persistence Basics

Abhi tak tumhari service ka data memory mein tha — restart maaro aur gayab. Persistence ka matlab hai data ka hona application restarts se pare. Is lesson mein relational modeling (tables, keys), PostgreSQL ke saath SQL (CRUD, joins, aggregates), indexes aur query performance, app se DB connect, aur credentials ko code se bahar rakhna dekhoge.

⏱ 20 min• Beginner• Building APIs with FastAPI

Persistence aur relational data kya hai

WHAT

Relational database mein data tables mein rehta hai — har table mein rows (records) aur columns (fields). Primary key har row ka unique number hai, foreign key kisi doosri table ko reference karta hai. PostgreSQL isi ka sabse popular free implementation hai.

WHEN

Jab data structure ho (entities + relationships), transactions matter karein, aur schema badalne par data sahi rehna chahiye — banking, bookings, inventory, users. AI pipelines mein bhi metadata/results isi mein jaate hain.

WHERE

Tumhari har real service ke peeche ek database hota hai — users, orders, chat history, eval results. Postgres ko managed service par chalao ya local Docker mein — dono par wahi SQL chalta hai.

Socho: list of dicts bhi data rakh leta hai, lekin restart par gayab, aur jab do cheezein aapas mein judi hon (order kis customer ka hai) toh dict list kaafi nahi padti. Table + keys se data ek jagah rehta hai, juda bhi rehta hai, aur bade par bhi tez dhoondha jaata hai.

Scope: Is lesson mein sirf core: modeling, SQL, indexes, connection, credentials. Migrations, transactions ki depth, ORMs ki full power — wo sab agle levels mein; yahan base itna hai ki tum query samajh sako.

Modeling — tables, keys, relationships

CREATE TABLE rooms (
    id         BIGSERIAL PRIMARY KEY,
    name       TEXT NOT NULL UNIQUE,
    capacity   INTEGER NOT NULL CHECK (capacity > 0)
);

CREATE TABLE bookings (
    id         BIGSERIAL PRIMARY KEY,
    room_id    BIGINT NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
    guest      TEXT NOT NULL,
    starts_at  TIMESTAMPTZ NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_bookings_room_start ON bookings (room_id, starts_at);
Modeling rule: Pehle nouns socho (rooms, bookings, users), phir unke beech ke rishte (ek room ki many bookings). Rishta ka matlab hamesha foreign key hota hai — junction tables many-to-many ke liye.

SQL — CRUD, filters, joins, aggregates

-- CRUD (chhote aur seedhe)
INSERT INTO rooms (name, capacity) VALUES ('Boardroom', 12) RETURNING id;
SELECT id, name, capacity FROM rooms WHERE capacity >= 8 ORDER BY capacity DESC;
UPDATE rooms SET capacity = 14 WHERE id = 3;
DELETE FROM rooms WHERE id = 3;

-- Filter + join + group + aggregate
SELECT r.name, count(b.id) AS bookings
FROM rooms r
LEFT JOIN bookings b ON b.room_id = r.id
WHERE r.capacity > 4
GROUP BY r.name
ORDER BY bookings DESC;

-- Pagination
SELECT * FROM bookings ORDER BY starts_at LIMIT 20 OFFSET 40;
TRAP: SELECT *: Production code mein * mat likho — columns badalne par client tootega aur index-covered query bhi waste hoti hai. Apne columns explicitly likho.

Indexes aur query performance

-- Plan dekho: query kaise chalegi
EXPLAIN SELECT guest FROM bookings WHERE room_id = 42;
--  -> Seq Scan on bookings   (poori table padhi — badi table par slow)

CREATE INDEX idx_bookings_room ON bookings (room_id);

EXPLAIN SELECT guest FROM bookings WHERE room_id = 42;
--  -> Index Scan using idx_bookings_room   (seedha lookup)
Performance rule: Pehle query design sahi (filter SQL mein, joins justified), phir index se usko fast banao. Galat query ka index sirf ghaur kar deta hai — galat rasta nahi badalta.

DB ko app se jodo — driver, pools, credentials

import os

import psycopg
from fastapi import FastAPI

app = FastAPI()

# Asli project mein pool lifespan mein banao (FastAPI lesson jaisa)
def get_conn():
    return psycopg.connect(os.environ["DATABASE_URL"])

@app.post("/rooms", status_code=201)
def create_room(name: str, capacity: int):
    with get_conn() as conn:
        with conn.cursor() as cur:
            cur.execute(
                "INSERT INTO rooms (name, capacity) VALUES (%s, %s) RETURNING id",
                (name, capacity),          # values alag tuple se — injection safe
            )
            room_id = cur.fetchone()[0]
    return {"id": room_id, "name": name, "capacity": capacity}
# .env (local — .gitignore mein, commit kabhi nahi)
DATABASE_URL=postgresql://app:localpass@localhost:5432/bookings

# .env.example (commit hota hai — sirf key names ka sample)
DATABASE_URL=

# Code mein:
# url = os.environ["DATABASE_URL"] — missing ho toh startup par hi clear error
Restart test: Service restart karo — data bacha? Agar haan toh persistence kaam kar rahi hai. Yahi 10-second check pehla hota hai har DB integration ka.

Exercise

Question: Primary key ki value table mein unique honi chahiye ya nahi? (ek shabd)

Question: SQL mein rows ko filter karne wala clause ka naam?

Question: Do tables ko jodne wala SQL clause ka naam?

Question: Column pe index banane ka main faayda kya hai? (ek shabd)

Common mistakes

Desi example: Bahi-khata vs har entry ki alag file

Relational DB ek bada bahi-khata hai: har cheez ka apna page (table), page ke columns (fields), aur kisi bhi entry ko doosri entry se jodne ka reference number (foreign key). Duplicate likhne se bachne ke liye entry ek jagah, doosre page par sirf uska number:

sql
-- Customer ek jagah, order mein sirf uska id
INSERT INTO customers (email) VALUES ('ravi@example.com') RETURNING id;  -- 7
INSERT INTO orders (customer_id, item) VALUES (7, 'gpu-hours');

-- Email badalna ho toh ek jagah update — har order apne aap sahi rehta hai
UPDATE customers SET email = 'ravi@office.com' WHERE id = 7;
Interview angle — yahan se sawaal aate hain
  • Q: Primary key aur foreign key ka farq? — PK apni row ka unique id, FK doosri table ko reference karta hai.
  • Q: JOIN kyun chahiye — sab kuch ek table mein kyun nahi? — normalization se duplication kam, data consistent rehta hai.
  • Q: Index kaise madad karta hai aur kab nuksaan deta hai? — lookup fast, par writes aur storage ka cost.
  • Q: SQL injection kaise rokte hain? — parameterized queries/ORM, user input ko kabhi SQL mein string se nahi jodna.
  • Q: Service restart ke baad data kyun bacha? — persistence: data memory nahi, database disk par hai.
Lesson complete?

Data ab zinda hai. Agla lesson — Git & Collaboration — mein code, history aur teammates ko manage karna seekhenge.

Popular courses: Data Science Course in Lucknow · AI Course in Lucknow · Python Course in Lucknow · Power BI Course · Data Analytics Course