מערך שיעור: מהו Database וחיבור ראשוני
משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).
מטרת השיעור: הסטודנטים יבינו למה מערכות שומרות נתונים במסד ולא בקבצים, יכירו את מבנה הנתונים הרלציוני ברמה הנדרשת, ויתחברו למסד מקוד Python בצורה נכונה ובטוחה.
בסוף השיעור הסטודנטים צריכים:
- להסביר את היתרונות של Database על קובץ JSON, ולתכנן טבלה (עמודות, טיפוסים, Primary Key, NOT NULL/UNIQUE) מתוך דרישה או Class.
- להריץ את MySQL בקונטיינר של Docker, להתחבר אליו מ-VS Code עם Database Client, ולהסביר מה הוא Driver ומהם פרטי החיבור.
- לפתוח חיבור, להריץ שאילתת בדיקה, לקרוא תוצאה, ולסגור עם 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 סטודנטים נרשמים באותה דקה. מה עלול להשתבש?”
מהלך:
- לתת לכיתה 3 דקות לחשוב בזוגות.
- לאסוף תשובות. להוביל לשלוש: (א) מירוץ (Race Condition): שתי בקשות קוראות את אותו קובץ, כל אחת מוסיפה סטודנט וכותבת, ואחד הסטודנטים נמחק. (ב) ביצועים: כל בקשה קוראת וכותבת קובץ שלם. (ג) קריסה באמצע כתיבה: קובץ פגום.
- להמחיש את (א): שני סטודנטים ליד הלוח, כל אחד “קורא” את הרשימה (מעתיק לדף), מוסיף שם, ו"כותב" (מוחק את הלוח וכותב את הדף שלו). רק שם אחד נשאר.
- לשאול: “מה צריך כדי שזה לא יקרה?” ולהגיע ל: מערכת שמנהלת גישה בו-זמנית, כותבת רק מה שהשתנה, ומבטיחה שלמות. Database.
מה המרצה מראה בסוף: את טבלת “בעיה בקובץ JSON / מה קורה”, ולידה טבלת students מצוירת (עמודות, שורות, PK). משפט סיום: “קובץ שומר נתונים. Database מנהל אותם. מחר נכניס לטבלה את השורות הראשונות.”