יש כלים וממשקי API שמקלים על ניהול הנתונים המאוחסנים של אפליקציה.
מסוףGoogle Cloud
כשמשתמשים ב- Google Cloud console, חשוב לזכור ש-NDB מיושם באמצעות Datastore ו-memcache. כש-NDB 'קורא' ערך, הוא בודק קודם את Memcache. הוא קורא ממאגר הנתונים רק אם הוא לא מוצא את הערך ב-Memcache.
לכן, אם משתמשים במסוף Google Cloud כדי לערוך ישות ב-Datastore, יכול להיות שהאפליקציה עדיין תשתמש בערך ה "ישן" אם הערך הזה נמצא ב-Memcache. אפשר לעקוף את הבעיה על ידי ניקוי של memcache. עם זאת, מדובר בשיטה שעלולה לשבש את הפעולה. אם אתם צריכים לשנות ערכים באופן ידני לעיתים קרובות, כדאי להגדיר ממשק משתמש באפליקציה שיכתוב ערכים באמצעות ספריית הלקוח של NDB. כתיבה באמצעות NDB שומרת על סנכרון בין Datastore לבין memcache.
שאילתות לקבלת מטא נתונים
NDB תומך ב-API לשאילתות מטא-נתונים. ההרשאה הזו מאפשרת לאפליקציה לקבל מידע כללי על השימוש שלה ב-Datastore. ה-API הזה נמצא במודול google.appengine.ext.ndb.metadata. יש לו פונקציות:
-
get_namespaces(start=None, end=None): החזרת רשימה של שמות מרחבי שמות -
get_kinds(start=None, end=None): החזרת רשימה של שמות סוגים -
get_properties_of_kind(kind, start=None, end=None): מחזירה רשימה של שמות מאפיינים עבור שם הסוג שצוין -
get_representations_of_kind(kind, start=None, end=None): מחזירה מיפוי של שמות מאפיינים עבור שם הסוג שצוין לרשימות של שמות ייצוג, כמוSTRING, BOOLEANאוINT64.
לפונקציות האלה יש ארגומנטים אופציונליים של התחלה וסיום שאפשר להשתמש בהם כדי להגביל את השאילתה לטווח מסוים. במקרה הזה, ההתחלה היא כוללת והסיום הוא לא כולל. ברירת המחדל של שניהם היא None. לדוגמה, כדי לקבל את כל מרחבי השמות שמתחילים באות קטנה, אפשר להתקשר אל get_namespaces('a', chr(ord('z') + 1)).
כל אלה, חוץ מ-get_namespaces(), מוגבלים באופן מרומז למרחב השמות הנוכחי. החיוב על שאילתות ועל אחזור מטא-נתונים זהה לחיוב על שאילתות ועל אחזור נתונים ב-Datastore.
שאילתות לגבי נתונים סטטיסטיים
מאגר הנתונים שומר נתונים סטטיסטיים על הנתונים שנשמרים באפליקציה, כמו מספר הישויות מסוג מסוים או נפח האחסון שמשמש לערכי מאפיינים מסוג מסוים. אפשר לראות את הנתונים הסטטיסטיים האלה במסוף Google Cloud , בדף Dashboard.
אפשר גם לגשת לערכים האלה באופן פרוגרמטי בתוך האפליקציה באמצעות שאילתות לגבי ישויות עם שמות מיוחדים באמצעות Datastore API.
אפשר לגשת לכל נתון סטטיסטי כישות ששם הסוג שלה מתחיל ומסתיים בשני קווים תחתונים. לדוגמה, לכל אפליקציה יש בדיוק ישות אחת מהסוג
__Stat_Total__ שמייצגת נתונים סטטיסטיים על כל הישויות ב-Datastore בסך הכול. לכל ישות סטטיסטית יש את המאפיינים הבאים:
-
count, מספר הפריטים שנכללים בחישוב הסטטיסטיקה (מספר שלם ארוך) -
bytes, הגודל הכולל של הפריטים בנתון הסטטיסטי הזה (מספר שלם ארוך) -
timestamp, השעה של העדכון האחרון של הנתון הסטטיסטי (ערך של תאריך ושעה)
יש גם סוגים של נתונים סטטיסטיים עם מאפיינים נוספים, שמפורטים בהמשך.
אפליקציה יכולה להשתמש במחלקות של מודלים שסופקו על ידי החבילה google.appengine.ext.ndb.stats כדי לגשת לישויות סטטיסטיות.
from google.appengine.ext.ndb import stats
global_stat = stats.GlobalStat.query().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count
כשמערכת הסטטיסטיקה יוצרת ישויות סטטיסטיות חדשות, היא לא מוחקת את הישנות באופן מיידי. הדרך הכי טובה לקבל תצוגה עקבית של הנתונים הסטטיסטיים היא לשלוח שאילתה לגבי הישות
GlobalStatעם הערך העדכני ביותר של timestamp, ואז להשתמש בערך חותמת הזמן הזה כמסנן כשמאחזרים ישויות אחרות של נתונים סטטיסטיים.
ישויות הנתונים הסטטיסטיים כלולות בערכים המחושבים של הנתונים הסטטיסטיים. ישויות סטטיסטיות תופסות נפח אחסון בהתאם למספר הסוגים הייחודיים ולשמות המאפיינים שבהם נעשה שימוש באפליקציה.
מערכת הנתונים הסטטיסטיים תיצור גם נתונים סטטיסטיים ספציפיים לכל מרחב שמות. שימו לב: אם אפליקציה לא משתמשת במרחבי שמות של Datastore, לא ייווצרו נתונים סטטיסטיים ספציפיים למרחב השמות. נתונים סטטיסטיים ספציפיים למרחב שמות
נמצאים במרחב השמות שאליו הם ספציפיים. לשמות הסוגים של נתונים סטטיסטיים ספציפיים למרחב שמות יש קידומת __Stat_Ns_ והסיומת שלהם זהה לסיומת של סוגי נתונים סטטיסטיים ברמת האפליקציה.
אפליקציות עם אלפי מרחבי שמות, סוגים או שמות מאפיינים דורשות מספר גדול מאוד של ישויות סטטיסטיות. כדי לשמור על תקורה סבירה של אחסון ועדכון הסטטיסטיקות, Datastore מפסיק בהדרגה את השימוש בישויות סטטיסטיקה, בסדר הבא:
- נתונים סטטיסטיים לכל מרחב שמות, לכל סוג ולכל מאפיין:
__Stat_Ns_PropertyName_Kind__,__Stat_Ns_PropertyType_PropertyName_Kind__ - נתונים סטטיסטיים לפי סוג ולפי מאפיין:
__Stat_PropertyName_Kind__,__Stat_PropertyType_PropertyName_Kind__ - נתונים סטטיסטיים לכל מרחב שמות ולכל סוג:
__Stat_Ns_Kind__,__Stat_Ns_Kind_IsRootEntity__,__Stat_Ns_Kind_NotRootEntity__,__Stat_Ns_PropertyType_Kind__ - סטטיסטיקות לפי סוג:
__Stat_Kind__,__Stat_Kind_IsRootEntity__,__Stat_Kind_NotRootEntity__,__Stat_PropertyType_Kind__ - סטטיסטיקה לכל מרחב שמות:
__Stat_Namespace__,__Stat_Ns_Kind_CompositeIndex__,__Stat_Ns_PropertyType__,__Stat_Ns_Total__
הישויות של הנתונים הסטטיסטיים של הסיכום (__Stat_Kind_CompositeIndex__,
__Stat_PropertyType__, __Stat_Total__) אף פעם לא נמחקות.
הרשימה המלאה של הנתונים הסטטיסטיים הזמינים:
| נתון סטטיסטי | סוג הישות של הנתון הסטטיסטי | תיאור |
|---|---|---|
| כל הישויות | __Stat_Total__ Namespace specific entry: __Stat_Ns_Total__ |
כל הישויות. מאפיינים נוספים: • entity_bytes: נפח האחסון בטבלת הישויות, שנמדד בבייטים.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הערכים באינדקס המובנה.• composite_index_bytes: האחסון ברשומות של אינדקס מורכב, נמדד בבייטים.• composite_index_count: מספר הרשומות באינדקס המורכב. |
| כל הישויות במרחב שמות | __Stat_Namespace__ שימו לב: __Stat_Namespace__ ישויות נוצרות לכל מרחב שמות שנתקל בו, והן נמצאות רק במרחב השמות של המחרוזת הריקה. |
כל הישויות במרחב שמות. • subject_namespace, מרחב השמות שמיוצג (מחרוזת)• entity_bytes: נפח האחסון בטבלת הישויות, שנמדד בבייטים.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הערכים באינדקס המובנה.• composite_index_bytes: האחסון ברשומות של אינדקס מורכב, נמדד בבייטים.• composite_index_count: מספר הרשומות באינדקס המורכב. |
| כל הערכים באינדקסים שהוגדרו באפליקציה | __Stat_Kind_CompositeIndex__רשומה ספציפית למרחב שמות: __Stat_Ns_Kind_CompositeIndex__ |
רשומות בטבלת האינדקס המורכב; ישות סטטיסטית אחת לכל סוג ישות שמאוחסנת. מאפיינים נוספים: • index_id, מזהה האינדקס.• kind_name, השם של הסוג שמיוצג (מחרוזת) |
| ישויות מסוג מסוים | __Stat_Kind__ רשומה ספציפית למרחב שמות: __Stat_Ns_Kind__ |
ישויות מסוג מסוים; ישות סטטיסטית אחת לכל סוג של ישות שמאוחסנת. מאפיינים נוספים: • kind_name, the name of the kind represented (a string)• entity_bytes: The storage in the entities table measured in bytes.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הערכים באינדקס המובנה.• composite_index_bytes: האחסון ברשומות של אינדקס מורכב, נמדד בבייטים.• composite_index_count: מספר הרשומות באינדקס המורכב. |
| ישות שורש מסוג מסוים | __Stat_Kind_IsRootEntity__ Namespace specific entry: __Stat_Ns_Kind_IsRootEntity__ |
ישויות מסוג מסוים שהן ישויות שורש בקבוצת ישויות (אין להן ישות אב); ישות סטטיסטית אחת לכל סוג של ישות שמאוחסנת. מאפיינים נוספים: • kind_name, השם של הסוג שמיוצג (מחרוזת)• entity_bytes: האחסון בטבלת הישויות שנמדד בבייטים. |
| ישות שאינה שורש מסוג מסוים | __Stat_Kind_NotRootEntity__ Namespace specific entry: __Stat_Ns_Kind_NotRootEntity__ |
ישויות מסוג שלא מוגדר כשורש של קבוצת ישויות (יש להן ישות אב קודמת); ישות סטטיסטית אחת לכל סוג ישות שמאוחסנת. מאפיינים נוספים: • kind_name, the name of the kind represented (a string)• entity_bytes: The storage in the entities table measured in bytes. |
| מאפיינים של סוג | __Stat_PropertyType__ Namespace specific entry: __Stat_Ns_PropertyType__ |
מאפיינים של סוג ערך בכל הישויות; ישות סטטיסטיקה אחת לכל סוג ערך. מאפיינים נוספים: • property_type, שם סוג הערך (מחרוזת)• entity_bytes: האחסון בטבלת הישויות, שנמדד בבייטים.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הרשומות באינדקס המובנה. |
| מאפיינים מסוג מסוים לכל סוג | __Stat_PropertyType_Kind__ Namespace specific entry: __Stat_Ns_PropertyType_Kind__ |
מאפיינים של סוג ערך בישויות מסוג נתון; ישות סטטיסטית אחת לכל שילוב של סוג מאפיין וסוג. מאפיינים נוספים: • property_type, שם סוג הערך (מחרוזת)• kind_name, שם הסוג שמיוצג (מחרוזת)• entity_bytes: האחסון בטבלת הישויות, שנמדד בבייטים.• builtin_index_bytes: האחסון באינדקס המובנה, נמדד בבייטים.• builtin_index_count: מספר הרשומות באינדקס המובנה. |
| נכסים עם שם | __Stat_PropertyName_Kind__ Namespace specific entry: __Stat_Ns_PropertyName_Kind__ |
מאפיינים עם שם נתון בישויות מסוג נתון; ישות סטטיסטית אחת לכל שילוב של שם מאפיין ייחודי וסוג. מאפיינים נוספים: • property_name, שם המאפיין (מחרוזת)• kind_name, שם הסוג שמיוצג (מחרוזת)• entity_bytes: האחסון בטבלת הישויות, שנמדד בבייט.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הרשומות באינדקס המובנה. |
| מאפיינים מסוג מסוים ועם שם | __Stat_PropertyType_PropertyName_Kind__ Namespace specific entry: __Stat_Ns_PropertyType_PropertyName_Kind__ |
מאפיינים עם שם נתון וסוג ערך נתון בישויות מסוג נתון. יש ישות סטטיסטית אחת לכל שילוב של שם מאפיין, סוג ערך וסוג שקיים ב-Datastore. מאפיינים נוספים: • property_type, השם של סוג הערך (מחרוזת)• property_name, השם של המאפיין (מחרוזת)• kind_name, השם של הסוג שמיוצג (מחרוזת)• entity_bytes: האחסון בטבלת הישויות שנמדד בבייט.• builtin_index_bytes: האחסון ברשומות של אינדקס מובנה, שנמדד בבייטים.• builtin_index_count: מספר הרשומות באינדקס המובנה. |
חלק מהנתונים הסטטיסטיים מתייחסים לסוגי ערכים של מאפיינים ב-Datastore לפי שם, כמחרוזות. השמות האלה הם:
"Blob""BlobKey""Boolean""Category""Date/Time""Email""Float""GeoPt""IM""Integer""Key""Link""NULL""PhoneNumber""PostalAddress""Rating""ShortBlob""String""Text""User"