Join Query on Google App Engine Datastore
App Engine Datastore is a no sql database. That means you cannot do standard sql queries. But they do have the basic queries using GQL. It is a no SQL database which is very reliable, does not slow down even with terabytes of data, and has a nice indexing mechanism to fetch data.
You can use Google Cloud SQL if you need a relational database, it's a manage mySQL database by google. By the time I'm writing this, they now support up to 100GB of mySQL database, but still limited to the limitations of a standard mySQL and it's coolness.
So if you really can't avoid a de-normalize table like you want to show the name of a user in a list, I'll show you samples. This will all be using python 2.7 and ndb.
You can use Google Cloud SQL if you need a relational database, it's a manage mySQL database by google. By the time I'm writing this, they now support up to 100GB of mySQL database, but still limited to the limitations of a standard mySQL and it's coolness.
So if you really can't avoid a de-normalize table like you want to show the name of a user in a list, I'll show you samples. This will all be using python 2.7 and ndb.
from google.appengine.ext import ndb # just a sample model for how to efficiently join them class User(ndb.Model): name = ndb.StringProperty() photo = ndb.BlobKeyProperty() """ always create a text version of your blobkey and store the result of images.get_serving_url(blob) to it one time if your app allows it """ photo_path = ndb.TextProperty() class Page(ndb.Model): data = ndb.TextProperty() class Comment(ndb.Model): user = ndb.KeyProperty() page = ndb.KeyProperty() created = ndb.DateTimeProperty(auto_now_add=True) message = ndb.TextProperty() @classmethod @ndb.tasklet def get_comment_async(comment): result = comment.to_dict() user = yield comment.user.get_async() result['user'] = { 'name' : user.name, 'photo' : user.photo_path } raise ndb.Return(result) # on your handler class MainHandler(webapp.RequestHandler): def get(self): page = Page.get_by_id(self.request.get('id')) # now we query comments of the page comments = Comment.query(Comment.page == page.key) .order(-Comment.created).fetch() futures = [] # another good use of tasklet is to load fields info asynchronously for comment in comments: futures.append(yield Comment.get_comment_async(comment)) # ndb will try to batch what it can so it only does few network hops ndb.Future.wait_all(futures) # pass your results to your view view_data['comments'] = [future.get_result() for future in futures]
Comments
Post a Comment