תעלול: למפות db קיים לsqlalchemy

Alonisser ,05/12/2011

אנחנו אוהבים את sqlalchemy.  כלי הorm המגניב כל כך של פייטון והדרך הנכונה לטפל בsql בכלל.

אנחנו ממש אוהבים את הdeclarative  layerשל sqlalchemy. כי אנחנו עצלנים. וכי הוא משאיר אותנו לכתוב את מה שאנחנו צריכים לכתוב - אחלה פתרונות תוכנה. (נכון, שנגדל, יכול להיות שנצטרך לכתוב מחדש את הsql הזה, או בכלל להחליף לNosql או לטכנולוגית wtf/Omg חדשה אחרת, אבל זה יהיה שנגדל ובינתיים נזכור את העצה הטובה: you don't have a scaling problem yet)

אבל לפעמים אנחנו צריכים לעשות פרוייקטים עם db של מישהו אחר, להתממשק לתוכנה של צד שלישי, לדבר עם הdatabase של אתר אינטרנט קיים.

וכאמור, אנחנו עצלנים ועייפים ועם דדליין. ולא בא לנו להעתיק סכמות ולנתח אותן.

אז הבשורה הטובה היא שאנחנו כבר לא צריכים..

הנה הסבר בשני שלבים (כולו בdeclarative layer אבל יש מקבילות גם ברגיל):

שלב א': המגניב.

class bookmarks(base): #עד כאן פתיחה רגיל של מחלקה ב
                       #sqlalchemy delclarativel layer/
     __tablename__ = 'thebookmarkstable' # the table name in the db - עד כאן עדיין הפתיחה הרגילה
     __table_args__ = {'autoload':True}

תאמינו או לא אבל הקסם בהוראה השנייה עובד (בד"כ) - ומכאן מאפשר גישה מלאה לטבלה ולעבודה מולה (בהנחה שאנחנו יודעים את שמות השדות.)

אם נרצה נוכל לכפות/להגדיר לsqlalchemy את מיפוי השדות מהטבלה הקיימת . פשוט בהוספת column נוספים . לא חובה אפילו את כולם, אפשר רק את אלו שאנחנו רוצים להגדיר לגביהם משהו מיוחד לתת לautoload לנהל את השאר.

מגניב.

שלב ב': המטריף.

נתחיל באכזבה, לא תמיד הקסם עובד כמו שצריך. התנסות כזו שהייתה לי בעבודה מול mssql  לא הייתה מלבבת (בלשון המעטה)  ואז אין ברירה מלכתוב המון שורות של טורי הטבלה (או רחמנא ליצלן - טבלאות) .

תופים והרמת מסך … גבירותי ורבותי.. קבלו את .sqlautocode  שנכנסת לעזרתנו

sqlautocode היא בעצם תוסף sqlalchemy  שפשוט עושה את זה בשבילנו ועובד ישירות משורת הפקודה.

מתקינים את sqlautocode משורת הפקודה עם easy_install או Pip מנועי ההפצה והתקנה של ספריות פייטון ומוכנים להתחיל.

sqlautocode היא כלי שעובד משורת הפקודה. אז נכנס לשורת הפקודה ונכתוב שורה כמו:

sqlautocode -o model.py -d sqlite:///some.db  -t sometable,othertable
 
-d אם נשמיט נקבל תיאור טבלאי שלא בdeclartive layer
-o filename.py קובץ היעד
-t sometable,someothertable שמות טבלאות ספציפיות אם לא רוצים את כל הדי.בי

ותוך דקותיים התוכנית תייצר את קובץ Model.py שכולל את מיפוי השדות של הטבלה/טבלאות שביקשתם כולל קשרים וכו' והכל בפורמט של מחלקת declarative layer ב sqlalchemy  מוכנה כבר!

מומלץ, נסו ותהנו.

תגובה