在 AppEngine 上使用 Python 的 NDB
NDB 將模型關聯為 python 物件,可以在 Appengine NoSQL 資料儲存中儲存和訪問,可供所有 AppEngine 應用程式使用。
models.py
from google.appengine.ext import ndb
# https://cloud.google.com/appengine/docs/python/ndb/properties
class Series(ndb.Model):
"""TV Series Object"""
folder_name = ndb.StringProperty()
title = ndb.StringProperty()
rating = ndb.StringProperty()
banner_blob_key = ndb.BlobKeyProperty()
year = ndb.IntegerProperty()
plot = ndb.TextProperty()
genre = ndb.StringProperty(repeated=True)
json_of_show = ndb.JsonProperty()
date_added = ndb.DateTimeProperty(auto_now_add=True)
date_updated = ndb.DateTimeProperty(auto_now=True)
class Episode(ndb.Model):
"""Episode Object (Series have Episodes)"""
series = ndb.KeyProperty(kind=Series)
episode_title = ndb.StringProperty()
season = ndb.IntegerProperty()
episode_number = ndb.IntegerProperty()
thumb_blob_key = ndb.BlobKeyProperty()
episode_json = ndb.JsonProperty()
date_added = ndb.DateTimeProperty(auto_now_add=True)
date_updated = ndb.DateTimeProperty(auto_now=True)
在定義了模型後,我們可以建立新物件以進入資料儲存區:
nfo = xmltodict.parse(my_great_file.xml)
s = Series()
s.folder_name = gcs_file.filename[:-10]
s.title = nfo['tvshow'].get('title', None)
s.rating = nfo['tvshow'].get('rating', None)
# Below we use the google cloud storage library to generate a blobkey for a GCS file
s.banner_blob_key = BlobKey((blobstore.create_gs_key('/gs' + gcs_file.filename[:-10] + 'banner.jpg')))
s.year = int(nfo['tvshow'].get('year', None))
s.plot = nfo['tvshow'].get('plot', None)
# genre is a repeated type, and can be stored as a list
s.genre = nfo['tvshow'].get('genre', 'None').split('/')
s.json = json.dumps(nfo)
s.put_async() #put_async writes to the DB without waiting for confirmation of write.
新增劇集並將其與系列相關聯:
nfo = xmltodict.parse(my_great_file.xml)
epi = Episode()
epi.show_title = nfo['episodedetails'].get('showtitle', None)
epi.title = nfo['episodedetails'].get('title', None)
# We'll query the Series for use later
show_future = Series.query(Series.title == epi.show_title).get_async()
epi.json = json.dumps(nfo)
... # We perform other assorted operations to store data in episode properties
# Ask for the show we async queried earlier
show = show_future.get_result()
# Associate this episode object with a Series by Key
epi.series = show.key
epi.put_async() # Write the object without waiting
稍後,檢索所有系列:
shows = Series.query()
如果不需要所有節目,則可以應用過濾器 。
更多閱讀: