שימוש ב-Firestore במצב Datastore ‏ (Datastore)

‫Firestore הוא מסד נתונים מסוג NoSQL לאחסון מסמכים שמיועד להתאמה לעומס (automatic scaling), לביצועים גבוהים ולפיתוח אפליקציות בקלות. זו הגרסה החדשה ביותר של Datastore, והיא כוללת כמה שיפורים בהשוואה ל-Datastore. מכיוון ש-Firestore במצב Datastore (Datastore) מותאם לתרחישי שימוש בשרתים ול-App Engine, מומלץ להשתמש ב-Datastore למסדי נתונים שישמשו בעיקר אפליקציות של App Engine. ‫Firestore במצב Native הכי שימושי בתרחישים לדוגמה של ניידים והתראות בזמן אמת. מידע נוסף על מצבי Firestore זמין במאמר בחירה בין מצב מקורי למצב Datastore.

במאמר הזה מוסבר איך להשתמש בספריות לקוח בענן כדי לאחסן ולאחזר נתונים במסד נתונים במצב Datastore. אפשר להשתמש באפליקציה לדוגמה במדריך הזה לכל גרסה נתמכת של Python. לשם כך, צריך לציין את גרסת זמן הריצה ואת מערכת ההפעלה בקובץ app.yaml.

דרישות מוקדמות והגדרה

  • מגדירים את הסביבה והפרויקט כדי להבין את המבנה של האפליקציות ב-App Engine. חשוב לרשום ולשמור את מזהה הפרויקט, כי תצטרכו אותו כדי להריץ את אפליקציית הדוגמה שמתוארת במסמך הזה.

שכפול המאגר

מורידים (משכפלים) את הדוגמה:

  git clone https://github.com/GoogleCloudPlatform/python-docs-samples
  cd python-docs-samples/appengine/flexible/datastore

עריכה של הגדרת הפרויקט והגדרת יחסי תלות

כוללים את ספריית google-cloud-datastore בקובץ requirements.txt. זו ספריית הלקוח למצב Datastore.

Flask==3.0.3
google-cloud-datastore==2.20.2
gunicorn==23.0.0

קוד אפליקציה

היומנים של האפליקציה לדוגמה מאחזרים ומציגים את כתובות ה-IP של המבקרים. אפשר לראות שרשומה ביומן היא מחלקה עם שני שדות שמוקצית להם הסוג visit, והיא נשמרת במצב Datastore באמצעות הפקודה put. לאחר מכן, עשר הכניסות האחרונות מאוחזרות בסדר יורד באמצעות הפקודה query().

@app.route("/")
def index():
    ds = datastore.Client()

    user_ip = request.remote_addr

    # Keep only the first two octets of the IP address.
    if is_ipv6(user_ip):
        user_ip = ":".join(user_ip.split(":")[:2])
    else:
        user_ip = ".".join(user_ip.split(".")[:2])

    entity = datastore.Entity(key=ds.key("visit"))
    entity.update(
        {
            "user_ip": user_ip,
            "timestamp": datetime.datetime.now(tz=datetime.timezone.utc),
        }
    )

    ds.put(entity)
    query = ds.query(kind="visit", order=("-timestamp",))

    results = []
    for x in query.fetch(limit=10):
        try:
            results.append("Time: {timestamp} Addr: {user_ip}".format(**x))
        except KeyError:
            print("Error with result format, skipping entry.")

    output = "Last 10 visits:\n{}".format("\n".join(results))

    return output, 200, {"Content-Type": "text/plain; charset=utf-8"}

שימוש בקבצים ב-index.yaml

אפליקציית הדוגמה מבצעת שאילתות. שאילתות מורכבות יותר במצב Datastore דורשות אינדקסים אחד או יותר, שצריך לציין בקובץ index.yaml שמעלים יחד עם האפליקציה. אפשר ליצור את הקובץ הזה באופן ידני, או ליצור אותו באופן אוטומטי במהלך בדיקה מקומית של האפליקציה.

בדיקה מקומית

אם אתם צריכים לפתח ולבדוק את האפליקציה באופן מקומי, אתם יכולים להשתמש באמולטור של מצב Datastore.

למידע נוסף

מידע מלא על מצב Datastore, כולל אופטימיזציות ומושגים, זמין במאמרי העזרה בנושא Firestore במצב Datastore.