appengine/standard/ndb/queries/snippets.py (149 lines of code) (raw):

# Copyright 2016 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from google.appengine.ext import ndb from guestbook import Greeting from snippets_models import ( Account, Address, Article, Bar, Contact, Employee, FlexEmployee, Manager, ) def query_account_equality(): query = Account.query(Account.userid == 42) return query def query_account_inequality(): query = Account.query(Account.userid >= 40) return query def query_account_multiple_filters(): query = Account.query(Account.userid >= 40, Account.userid < 50) return query def query_account_in_steps(): query1 = Account.query() # Retrieve all Account entitites query2 = query1.filter(Account.userid >= 40) # Filter on userid >= 40 query3 = query2.filter(Account.userid < 50) # Filter on userid < 50 too return query1, query2, query3 def query_article_inequality(): query = Article.query(Article.tags != "perl") return query def query_article_inequality_explicit(): query = Article.query(ndb.OR(Article.tags < "perl", Article.tags > "perl")) return query def articles_with_tags_example(): # [START gae_ndb_query_included_in_inequality] Article(title="Perl + Python = Parrot", stars=5, tags=["python", "perl"]) # [END gae_ndb_query_included_in_inequality] # [START gae_ndb_query_excluded_from_inequality] Article(title="Introduction to Perl", stars=3, tags=["perl"]) # [END gae_ndb_query_excluded_from_inequality] def query_article_in(): query = Article.query(Article.tags.IN(["python", "ruby", "php"])) return query def query_article_in_equivalent(): query = Article.query( ndb.OR(Article.tags == "python", Article.tags == "ruby", Article.tags == "php") ) return query def query_article_nested(): query = Article.query( ndb.AND( Article.tags == "python", ndb.OR( Article.tags.IN(["ruby", "jruby"]), ndb.AND(Article.tags == "php", Article.tags != "perl"), ), ) ) return query def query_greeting_order(): query = Greeting.query().order(Greeting.content, -Greeting.date) return query def query_greeting_multiple_orders(): query = Greeting.query().order(Greeting.content).order(-Greeting.date) return query def query_purchase_with_customer_key(): # [START gae_ndb_query_purchase_with_customer_key_models] class Customer(ndb.Model): name = ndb.StringProperty() class Purchase(ndb.Model): customer = ndb.KeyProperty(kind=Customer) price = ndb.IntegerProperty() # [END gae_ndb_query_purchase_with_customer_key_models] def query_purchases_for_customer_via_key(customer_entity): purchases = Purchase.query(Purchase.customer == customer_entity.key).fetch() return purchases return Customer, Purchase, query_purchases_for_customer_via_key def query_purchase_with_ancestor_key(): # [START gae_ndb_query_purchase_with_ancestor_key_models] class Customer(ndb.Model): name = ndb.StringProperty() class Purchase(ndb.Model): price = ndb.IntegerProperty() # [END gae_ndb_query_purchase_with_ancestor_key_models] def create_purchase_for_customer_with_ancestor(customer_entity): purchase = Purchase(parent=customer_entity.key) return purchase def query_for_purchases_of_customer_with_ancestor(customer_entity): purchases = Purchase.query(ancestor=customer_entity.key).fetch() return purchases return ( Customer, Purchase, create_purchase_for_customer_with_ancestor, query_for_purchases_of_customer_with_ancestor, ) def print_query(): print(Employee.query()) # -> Query(kind='Employee') print(Employee.query(ancestor=ndb.Key(Manager, 1))) # -> Query(kind='Employee', ancestor=Key('Manager', 1)) def query_contact_with_city(): query = Contact.query(Contact.addresses.city == "Amsterdam") return query def query_contact_sub_entities_beware(): query = Contact.query( Contact.addresses.city == "Amsterdam", # Beware! Contact.addresses.street == "Spear St", ) return query def query_contact_multiple_values_in_single_sub_entity(): query = Contact.query( Contact.addresses == Address(city="San Francisco", street="Spear St") ) return query def query_properties_named_by_string_on_expando(): property_to_query = "location" query = FlexEmployee.query(ndb.GenericProperty(property_to_query) == "SF") return query def query_properties_named_by_string_for_defined_properties(keyword, value): query = Article.query(Article._properties[keyword] == value) return query def query_properties_named_by_string_using_getattr(keyword, value): query = Article.query(getattr(Article, keyword) == value) return query def order_query_results_by_property(keyword): expando_query = FlexEmployee.query().order(ndb.GenericProperty("location")) property_query = Article.query().order(Article._properties[keyword]) return expando_query, property_query def print_query_keys(query): for key in query.iter(keys_only=True): print(key) def reverse_queries(): # Set up. q = Bar.query() q_forward = q.order(Bar.key) q_reverse = q.order(-Bar.key) # Fetch a page going forward. bars, cursor, more = q_forward.fetch_page(10) # Fetch the same page going backward. r_bars, r_cursor, r_more = q_reverse.fetch_page(10, start_cursor=cursor) return (bars, cursor, more), (r_bars, r_cursor, r_more) def fetch_message_accounts_inefficient(message_query): message_account_pairs = [] for message in message_query: key = ndb.Key("Account", message.userid) account = key.get() message_account_pairs.append((message, account)) return message_account_pairs def fetch_message_accounts_efficient(message_query): def callback(message): key = ndb.Key("Account", message.userid) account = key.get() return message, account message_account_pairs = message_query.map(callback) # Now message_account_pairs is a list of (message, account) tuples. return message_account_pairs def fetch_good_articles_using_gql_with_explicit_bind(): query = ndb.gql("SELECT * FROM Article WHERE stars > :1") query2 = query.bind(3) return query, query2 def fetch_good_articles_using_gql_with_inlined_bind(): query = ndb.gql("SELECT * FROM Article WHERE stars > :1", 3) return query