# מערך שיעור: מהו Database וחיבור ראשוני<no value>

**משך:** יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

**מטרת השיעור:** הסטודנטים יבינו למה מערכות שומרות נתונים במסד ולא בקבצים, יכירו את מבנה הנתונים הרלציוני ברמה הנדרשת, ויתחברו למסד מקוד Python בצורה נכונה ובטוחה.

**בסוף השיעור הסטודנטים צריכים:**

1. להסביר את היתרונות של Database על קובץ JSON, ולתכנן טבלה (עמודות, טיפוסים, Primary Key, NOT NULL/UNIQUE) מתוך דרישה או Class.
2. להריץ את MySQL בקונטיינר של Docker, להתחבר אליו מ-VS Code עם Database Client, ולהסביר מה הוא Driver ומהם פרטי החיבור.
3. לפתוח חיבור, להריץ שאילתת בדיקה, לקרוא תוצאה, ולסגור עם try/finally, באמצעות `get_connection()` משותפת.

**דגש קריטי:** **"רק הבסיס הנדרש"**. הסילבוס מדגיש במפורש שלא הופכים את השבוע לקורס SQL. אין JOIN, אין GROUP BY ואין נרמול. אם סטודנטים מתקדמים שואלים, לתת כיוון קצר ("Foreign Key ו-JOIN, בהמשך המסלול") ולהמשיך.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| פתיחה: למה לא JSON? | 25 דק' | שני סטודנטים "מעדכנים" את אותו קובץ JSON על המסך בו-זמנית, ושינוי נדרס. טבלת הבעיות. |
| טבלה, שורה, עמודה, Primary Key | 35 דק' | ארון התיקים. מ-`Product` (נושא OOP) לתכנון טבלה, יחד על הלוח. |
| טיפוסים ואילוצים | 25 דק' | טלפון כ-TEXT. bool כ-0/1. NOT NULL/UNIQUE = "ולידציה במסד". |
| הפסקה | 15 דק' | |
| MySQL ב-Docker, Database Client, Driver | 40 דק' | `docker run` של הקונטיינר — כולם יחד, ובודקים עם `docker ps`. חיבור מ-Database Client. מתאם החשמל (Driver). חמשת פרטי החיבור (host + port — קישור לנושא רשתות). הקמת `school-db`. |
| הפסקה | 15 דק' | |
| Connection: פתיחה, בדיקה, סגירה | 50 דק' | Cursor, fetchone/fetchall. **הדגמת מלכודת ה-`with`** בלייב. try/finally. `get_connection`. |
| תרגול + Mini Project | 50 דק' | `db.py` עם Health Check. Commit. |
| בדוק את עצמך | 15 דק' | |

---

## דגשים להעברת השיעור

- **הגשר מאתמול:** להתחיל בהפעלה מחדש של שרת הזיכרון, והסטודנט שנעלם. "איפה שומרים נתונים בשרת אמיתי?"
- **מ-OOP לטבלאות:** Class ≈ Table, Attribute ≈ Column, אובייקט ≈ Row. ההקבלה מורידה את הפחד מ"עוד נושא חדש".
- **"ולידציה במסד"** (NOT NULL, UNIQUE) כשכבת הגנה נוספת, בדיוק כמו Validation ב-`__init__`. להדגיש שזה **לא במקום** ולידציה בקוד, אלא **בנוסף**.
- **Connection String = URL** — חיבור חזק לנושא מחשב, מערכת הפעלה ורשת (Protocol, Host, Port).
- **Docker Desktop פתוח ורץ** אצל כל הסטודנטים לפני `docker run` — רוב התקלות הן "failed to connect to the docker API". מי שנכשל בהתקנה בשבוע 1 — לטפל בזה לפני השיעור.
- **`docker run` פעם אחת, אחר כך `docker start`** — להדגים בלייב את שגיאת "container name is already in use". זה יחזור אצל רבים אחרי הפעלה מחדש של המחשב.
- **מלכודת ה-`with`** — לא לדלג. סטודנטים שזוכרים את `with open` מניחים אוטומטית שזה סוגר.
- **כלי צפייה** — להתקין בכיתה. לראות "בעיניים" את הטבלאות והשורות (מחר) עוזר מאוד להבנה.

---

## מושגים

| מושג | הסבר קצר |
|---|---|
| Database / DBMS | נתונים מאורגנים / התוכנה שמנהלת אותם. |
| Relational Database | מסד שמארגן נתונים בטבלאות. |
| Table / Row / Column | טבלה / רשומה / שדה עם טיפוס. |
| Primary Key | מזהה ייחודי, לא ריק ולא משתנה. |
| AUTOINCREMENT | המסד מייצר id עולה לבד. |
| INT / DECIMAL / VARCHAR / NULL | טיפוסי הבסיס שנשתמש בהם ב-MySQL. |
| NOT NULL / UNIQUE | אילוצים: חובה / ייחודי. |
| SQL / Query | שפת המסד / פקודה אחת. |
| Database Server | תהליך שמאזין על פורט (MySQL: 3306), ומתחברים אליו ברשת. |
| Driver | ספרייה שמחברת קוד לסוג מסד (`mysql-connector-python`). |
| Image / Container | התבנית (`mysql:8.4`) / העותק שרץ ממנה. |
| Environment Variable | משתנה סביבה, למשל לפרטי חיבור וסודות. |
| Connection / Cursor | ערוץ פתוח למסד / מריץ שאילתה ומחזיק תוצאות. |
| fetchone / fetchall | שורה אחת או None / רשימת שורות. |
| Health Check | שאילתת בדיקה (`SELECT 1`). |
| Database Client | תוסף VS Code לצפייה במסד ולהרצת SQL. |

---

## תרגיל חשיבה

**שאלת פתיחה (תחילת היום):** "השרת שלנו שומר סטודנטים בקובץ `students.json`. ביום ההרשמה, 200 סטודנטים נרשמים באותה דקה. מה עלול להשתבש?"

**מהלך:**

1. לתת לכיתה 3 דקות לחשוב בזוגות.
2. לאסוף תשובות. להוביל לשלוש: (א) **מירוץ** (Race Condition): שתי בקשות קוראות את אותו קובץ, כל אחת מוסיפה סטודנט וכותבת, ואחד הסטודנטים נמחק. (ב) **ביצועים**: כל בקשה קוראת וכותבת קובץ שלם. (ג) **קריסה באמצע כתיבה**: קובץ פגום.
3. **להמחיש את (א)**: שני סטודנטים ליד הלוח, כל אחד "קורא" את הרשימה (מעתיק לדף), מוסיף שם, ו"כותב" (מוחק את הלוח וכותב את הדף שלו). רק שם אחד נשאר.
4. לשאול: "מה צריך כדי שזה לא יקרה?" ולהגיע ל: מערכת שמנהלת גישה בו-זמנית, כותבת רק מה שהשתנה, ומבטיחה שלמות. Database.

**מה המרצה מראה בסוף:** את טבלת "בעיה בקובץ JSON / מה קורה", ולידה טבלת `students` מצוירת (עמודות, שורות, PK). משפט סיום: "**קובץ שומר נתונים. Database מנהל אותם.** מחר נכניס לטבלה את השורות הראשונות."
