Search code examples
pythongoogle-app-engineapp-engine-ndbgoogle-cloud-datastore

google app engine - ndb query to only get a few columns in python


In google app engine, is it possible to query the db to only get certain columns?

For example, I have a Model defined as follows:

class userData(ndb.Model):
    id = ndb.StringProperty()
    name = ndb.StringProperty()
    emailAddress = ndb.StringProperty()

I usually query the db as follows:

userData.query().filter(ndb.GenericProperty('id') == "requiredId").fetch()

But this gives me results which contain id, name and email.

Now I would like to get only id and name but not emailAddress. How can I do that?

Thank you!


Solution

  • What you need is called projection query

    Example:

    qry = Article.query()
    articles = qry.fetch(20, projection=[Article.author, Article.tags])
    for article in articles:
      # code here can use article.author, article.tags
      # but cannot use article.title
    

    Your code:

    class userData(ndb.Model):
        id = ndb.StringProperty()
        name = ndb.StringProperty()
        emailAddress = ndb.StringProperty()
    
    user = userData.query().filter(ndb.GenericProperty('id') ==  "requiredId")\
                           .fetch(projection=[userData.id, userData.name])
    

    Though I need to quote from the docs:

    Projection can be useful; if you only need two small properties each from several large entities, the fetch is more efficient since it gets and deserializes less data.

    Think about the above when you use projection queries

    P.S.

    Also use CapWords convention for class names in python if you want to follow the PEP