יש כלים וממשקי API שמקלים על ניהול הנתונים שמאוחסנים באפליקציה.
מסוףGoogle Cloud
כשמשתמשים ב- Google Cloud console, חשוב לזכור ש-NDB מיושם באמצעות Datastore ו-memcache. כש-NDB "קורא" ערך, הוא בודק קודם את memcache. הוא קורא מ-Datastore רק אם הוא לא מוצא את הערך ב-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, השם של הסוג שמיוצג (מחרוזת)• entity_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, השם של הסוג שמיוצג (מחרוזת)• entity_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"