ניהול NDB

יש כלים וממשקי API שמקלים על ניהול הנתונים שמאוחסנים באפליקציה.

מסוףGoogle Cloud

כשמשתמשים ב- Google Cloud console, חשוב לזכור ש-NDB מיושם באמצעות Datastore ו memcache. כש-NDB "קורא" ערך, הוא בודק קודם את memcache. הוא קורא מ-Datastore רק אם הוא לא מוצא את הערך ב-memcache.

לכן, אם משתמשים במסוף Google Cloud כדי לערוך ישות ב-Datastore, יכול להיות שהאפליקציה עדיין תשתמש בערך ה "ישן" אם הערך הזה נמצא ב-memcache. אפשר לעקוף את הבעיה על ידי ניקוי של memcache. עם זאת, הפעולה הזו עלולה לשבש את התהליך. אם אתם צריכים לשנות ערכים באופן ידני לעיתים קרובות, כדאי להגדיר ממשק משתמש באפליקציה שיכתוב ערכים באמצעות ספריית הלקוח של NDB. כתיבה באמצעות NDB שומרת על סנכרון בין Datastore לבין memcache.

שאילתות לקבלת מטא נתונים

‫NDB תומך ב-API של שאילתות מטא-נתונים. ה-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"