# מערך שיעור: Extract + Load📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יבנו סקריפט ETL בסיסי מקצה לקצה — Extract מ-API, Transform, Load ל-DB.

בסוף השיעור הסטודנטים צריכים: לשלוף נתונים עם requests, לעבד אותם עם כלים שכבר נלמדו, ולכתוב תוצאה ל-DB עם to_sql תוך הבנת if_exists.

דגש קריטי: זהו שיעור-אינטגרציה חלקי — Transform לא מלמד כלי חדש, רק מרכיב Extract+Load סביב מה שכבר קיים.

---

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

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | הציגו את מחזור Extract-Transform-Load |
| הרעיון: Extract עם requests | 20 דקות | GET מ-API, קישרו ל-HttpClient מ-ASP.NET Core |
| Extract מ-DB עם read_sql | 10 דקות | קישרו ל-EF Core/SQL מהיחידות הקודמות |
| Transform (חזרה קצרה) | 10 דקות | merge/groupby/ניקוי — כבר מוכר |
| הרעיון: Load עם to_sql | 20 דקות | if_exists — דיון על replace/append/fail |
| תרגול מודרך | 25 דקות | תרגיל 1+2 + התחלת פרויקט מסכם |

---

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

- קשרו requests ל-HttpClient/REST מיחידת ASP.NET Core במפורש — זו הפעם השנייה (אחרי Kafka) שסטודנטים רואים אותו רעיון (בקשת HTTP) בשפה שנייה.
- if_exists דורש דיון אמיתי, לא רק תחביר — תנו תרחישים ("דוח יומי מצטבר" מול "לוג אירועים מתמשך") ותנו לסטודנטים להחליט מה מתאים.
- הזכירו status_code checking כהרגל בריא — קישרו לטיפול-בשגיאות (try/catch) מיחידת C# הבסיסית, אותה גישה עסקית ("אל תניח שקריאה חיצונית תמיד מצליחה").

---

## מושגים

**Extract/Transform/Load** — שליפה/עיבוד/כתיבה.
**`requests`** — HTTP client בפייתון.
**`to_sql`** — כתיבת DataFrame לטבלת SQL.

---

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

**שאלת פתיחה:** "אתם מריצים סקריפט ETL שכותב 'דוח מכירות יומי' ל-DB. אם תבחרו `if_exists='append'` במקום `'replace'`, ותריצו את הסקריפט כל יום במשך שבוע — מה קורה לטבלה?"

**מהלך:** הובילו לתובנה: `append` יוסיף עוד ועוד שורות בכל הרצה — אחרי שבוע, יהיו 7 "דוחות" מעורבבים יחד באותה טבלה, לא דוח עדכני אחד. עבור "דוח מצב נוכחי", זו טעות ממשית. הובילו להבנה שהבחירה הנכונה (`replace`) תלויה בכוונה: "תמונת מצב עדכנית" מול "היסטוריה מצטברת".

**מה המרצה מראה בסוף:** הריצו את אותו סקריפט Load פעמיים ברצף — פעם עם `append` (הראו שהטבלה "מכפילה" את עצמה) ופעם עם `replace` (הראו שהטבלה נשארת בגודל קבוע, רק מעודכנת) — ההבדל הוויזואלי בטבלה עצמה (`SELECT COUNT(*)`) מבסס את הלקח.
