החיים בפרודקשן
במערכת אמיתית דברים לא עובדים כמו שהם עובדים בפיתוח, והרבה פעמים צריך עין טובה בשביל לזהות מראש את התקלות (כי זה לא יעזור לך לקטר שזה עבד אצלך על המחשב).
קחו את קוד ריילס הבא לדוגמא:
add_column :bundles_users, :joining_date, :date
execute <<-SQL
UPDATE bundles_users SET joining_date = created_at
WHERE joining_date is NULL
SQL
change_column :bundles_users, :joining_date, :date, null: false, default: -> { 'CURRENT_DATE' }
יש פה שלוש פקודות בסך הכל וגם בלי לדעת ריילס אפשר להצליח לקרוא אותן כדי לראות איפה זה נשבר:
קודם כל מוסיפים עמודה לטבלא (הטבלא נקראת
bundles_users
, לעמודה החדשה קוראיםjoining_date
והיא מסוג תאריך).אחרי זה מעתיקים את כל הערכים מעמודת
created_at
לעמודה החדשה שיצרנוובסוף מוסיפים NOT NULL Constraint על העמודה החדשה כדי ששורות חדשות לא ייכנסו עם ערך NULL.
יכולים לראות איפה זה נשבר?
נכון - במערכת אמיתית שורות מתווספות כל הזמן לטבלאות, ולכן בקוד כאן אם תתווסף שורה חדשה בין פקודת ההעתקה לפקודה שמוסיפה את ה Constraint, אז הערך עבורה יהיה Null ומגבלת ה NOT NULL החדשה תיכשל.
מיגרציה של מידע במערכת אמיתית היא אף פעם לא פעולה אטומית. הקוד שלנו חייב לדעת להסתדר עם מידע מעורבב ואת ה Constraints כדאי להוסיף רק כשהמידע הישן כבר התיישן ומחק את עצמו.