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

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

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

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


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותהציגו את מחזור Extract-Transform-Load
הרעיון: Extract עם requests20 דקותGET מ-API, קישרו ל-HttpClient מ-ASP.NET Core
Extract מ-DB עם read_sql10 דקותקישרו ל-EF Core/SQL מהיחידות הקודמות
Transform (חזרה קצרה)10 דקותmerge/groupby/ניקוי — כבר מוכר
הרעיון: Load עם to_sql20 דקות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(*)) מבסס את הלקח.