Classe Query

Nota: gli sviluppatori che creano nuove applicazioni sono vivamente incoraggiati a utilizzare la libreria client NDB, che offre diversi vantaggi rispetto a questa libreria client, come la memorizzazione automatica nella cache delle entità tramite l'API Memcache. Se attualmente utilizzi la libreria client di DB precedente, leggi la guida alla migrazione da DB a NDB

La classe Query rappresenta una query per il recupero di entità da App Engine Datastore. (Vedi anche la classe correlata GqlQuery, che definisce le query utilizzando GQL, un linguaggio di query simile a SQL.)

Query è definito nel modulo google.appengine.ext.db.

Nota: il meccanismo di query basato su indice supporta un'ampia gamma di query ed è adatto alla maggior parte delle applicazioni. Tuttavia, non supporta alcuni tipi di query comuni in altre tecnologie di database: in particolare, join e query aggregate non sono supportati all'interno del motore di query di Datastore. Consulta la pagina Query Datastore per conoscere i limiti delle query Datastore.

Introduzione

Un'applicazione crea un oggetto query per un determinato tipo di entità chiamando direttamente il costruttore Query

class Song(db.Model):
  title = db.StringProperty()
  composer = db.StringProperty()
  date = db.DateTimeProperty()

q = db.Query(Song)

oppure il metodo della classe all() della classe del modello del tipo:

q = Song.all()

Senza ulteriori modifiche, l'istanza risultante della classe Query recupererà tutte le entità esistenti del tipo specificato. Le chiamate al metodo sull'oggetto possono quindi essere utilizzate per personalizzare la query con criteri di filtro aggiuntivi, condizioni predecessore e ordinamento:

q.filter('title =', 'Imagine')
q.ancestor(ancestor_key)
q.order('-date')

Per praticità, tutti questi metodi restituiscono l'oggetto query stesso, in modo che possano essere raggruppati in una singola istruzione:

q.filter('title =', 'Imagine').ancestor(key).order('-date')

L'applicazione può quindi eseguire la query e accedere ai risultati in uno dei seguenti modi:

  • Tratta l'oggetto query come iterabile, per elaborare le entità corrispondenti una alla volta:

    for song in q:
      print song.title

    Questa operazione chiama in modo implicito il metodo run() della query per generare le entità corrispondenti. Equivale quindi a

    for song in q.run():
      print song.title

    Puoi impostare un limite per il numero di risultati da elaborare con l'argomento parola chiave limit:

    for song in q.run(limit=5):
      print song.title

    L'interfaccia Iterator non memorizza i risultati nella cache, quindi se crei un nuovo iteratore dall'oggetto query, la stessa query viene ripetuta dall'inizio.

  • Chiama il metodo get() della query per ottenere la prima singola entità corrispondente trovata in Datastore:

    song = q.get()
    print song.title
  • Chiama il metodo fetch() della query per ottenere un elenco di tutte le entità corrispondenti fino a un numero specificato di risultati:

    results = q.fetch(limit=5)
    for song in results:
      print song.title

    Come nel caso di run(), l'oggetto query non memorizza i risultati nella cache, quindi chiamando fetch() una seconda volta viene ripetuta la stessa query.

    Nota: raramente dovresti usare questo metodo; è quasi sempre meglio usare run().

Costruttore

Il costruttore per la classe Query è definito come segue:

class Query (model_class=None, keys_only=False, cursor=None, namespace=None, projection=None, distinct=False)

Crea un'istanza di classe Query per recuperare entità da App Engine Datastore.

Senza ulteriori modifiche, l'oggetto query risultante recupererà tutte le entità esistenti del tipo specificato da model_class. I metodi dell'istanza filter(), ancestor(), e order() possono quindi essere utilizzati per personalizzare la query con criteri di filtro aggiuntivi, condizioni predecessore e ordinamento.

Argomenti

model_class
Classe modello (o Espandio) che rappresenta il tipo di entità a cui si applica la query.
keys_only
Se true, restituisce solo le chiavi anziché le entità complete. Le query solo chiavi sono più veloci ed economiche di quelle che restituiscono entità complete.
cursore
Posizione del cursore in cui riprendere la query.
spazio dei nomi
Spazio dei nomi da utilizzare per la query.
proiezione
Elenco o tupla di nomi delle proprietà da restituire. Verranno restituite solo le entità che possiedono le proprietà specificate. Se non viene specificato, per impostazione predefinita vengono restituite intere entità. Le query di proiezione sono più veloci ed economiche di quelle che restituiscono entità complete.

Nota: se specifichi questo parametro, i requisiti di indice della query potrebbero cambiare.

distinto
Nel caso delle query di proiezione, distinct=True specifica che in un insieme di risultati verranno restituiti solo risultati completamente univoci. Verrà restituito solo il primo risultato per le entità che hanno gli stessi valori per le proprietà previste.
Vero
Restituisci solo il primo risultato per ogni insieme distinto di valori per le proprietà nella proiezione.
Falso
Vengono restituiti tutti i risultati.

Metodi di istanza

Le istanze della classe Query hanno i seguenti metodi:

filtro (property_operator, property_operator)

Aggiunge un filtro di proprietà alla query. La query restituirà solo le entità le cui proprietà soddisfano tutti i filtri.

Argomenti

property_operator
Stringa composta dal nome di una proprietà e da un operatore di confronto facoltativo (=, !=, <, <=, >, >=, IN), separati da uno spazio, ad esempio 'age >'. Se viene specificato solo il nome di una proprietà senza un operatore di confronto, il filtro confronta per l'uguaglianza (=) per impostazione predefinita.
valore
Valore da confrontare con il valore della proprietà. Ad esempio:

q.filter('height >', 42).filter('city =', 'Seattle')
q.filter('user =', users.get_current_user())

Il valore di confronto specificato deve essere dello stesso tipo di valore della proprietà confrontata.

ancestor (ancestor)

Aggiunge un filtro dei predecessori alla query. La query restituirà solo le entità con il predecessore specificato.

Argomento

ancestor
Entità o chiave predecessore.
order (proprietà)

Aggiunge un ordinamento alla query. Se vengono aggiunti più ordinamenti, questi verranno applicati nell'ordine specificato.

Argomento

proprietà
Stringa che indica il nome della proprietà su cui ordinare, facoltativamente preceduta da un trattino (-) per specificare l'ordine decrescente. Se ometti il trattino, per impostazione predefinita viene specificato l'ordine crescente. Ad esempio:
# Order alphabetically by last name:
q.order('last_name')

# Order by height, tallest to shortest:
q.order('-height')
proiezione ()

Restituisce la tupla delle proprietà nella proiezione o None.

is_keys_only ()

Restituisce un valore booleano che indica se la query è composta da sole chiavi.

run (read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policySTRONG_CONSISTENCYSTRONG_CONSISTENCYread_policy

Restituisce un comando iterabile per il loop dei risultati della query. Ciò consente di specificare l'operazione della query con le impostazioni dei parametri e di accedere ai risultati in modo iterativo:

  1. Recupera e ignora il numero di risultati specificato dall'argomento offset.
  2. Recupera e restituisce il numero massimo di risultati specificato dall'argomento limit.

Il rendimento del loop viene quindi scalato in modo lineare con la somma di offset + limit. Se sai quanti risultati vuoi recuperare, devi sempre impostare un valore limit esplicito.

Questo metodo utilizza il precaricamento asincrono per migliorare le prestazioni. Per impostazione predefinita, recupera i risultati da Datastore in piccoli batch, consentendo all'applicazione di arrestare l'iterazione ed evitare di recuperare più risultati di quelli necessari.

Suggerimento: per recuperare tutti i risultati disponibili quando il loro numero è sconosciuto, imposta batch_size su un valore grande, ad esempio 1000.

Suggerimento: se non devi modificare i valori dell'argomento predefiniti, puoi semplicemente utilizzare l'oggetto query direttamente come iterazione per controllare il loop. Questa operazione chiama implicitamente run() con argomenti predefiniti.

Argomenti

read_policy
Leggi il criterio che specifica il livello desiderato di coerenza dei dati:
STRONG_CONSISTENCY
Garantisce i risultati più recenti, ma limitati a un singolo gruppo di entità.
EVENTUAL_CONSISTENCY
Può comprendere più gruppi di entità, ma a volte restituisce risultati inattivi. In generale, le query a coerenza finale vengono eseguite più velocemente rispetto a quelle a elevata coerenza, ma non c'è alcuna garanzia.

Nota: le query globali (non predecessori) ignorano questo argomento.

scadenza
Tempo massimo, in secondi, di attesa che Datastore restituisca un risultato prima di interrompere con un errore. Accetta un valore intero o in virgola mobile. Non può essere impostato su un valore superiore al valore predefinito (60 secondi), ma può essere modificato verso il basso per garantire che una determinata operazione non vada a buon fine rapidamente (ad esempio per restituire una risposta più rapida all'utente, riprovare a eseguire l'operazione, provare un'operazione diversa o aggiungerla a una coda di attività).
offset
Numero di risultati da saltare prima di restituire il primo.
limite
Numero massimo di risultati da restituire. Se il criterio viene omesso o impostato su None, tutti i risultati disponibili verranno recuperati per impostazione predefinita.
batch_size
Numero di risultati da tentare di recuperare per batch. Se il criterio limit viene configurato, il valore predefinito corrisponde al limite specificato, altrimenti il valore predefinito è 20.
keys_only
Se true, restituisce solo le chiavi anziché le entità complete. Le query solo chiavi sono più veloci ed economiche di quelle che restituiscono entità complete.
proiezione
Elenco o tupla di nomi delle proprietà da restituire. Verranno restituite solo le entità che possiedono le proprietà specificate. Se non viene specificato, per impostazione predefinita vengono restituite intere entità. Le query di proiezione sono più veloci ed economiche di quelle che restituiscono entità complete.

Nota: se specifichi questo parametro, i requisiti di indice della query potrebbero cambiare.

start_cursor
Posizione del cursore da cui iniziare la query.
end_cursor
Posizione del cursore alla quale terminare la query.
get (read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY)

Esegue la query e restituisce il primo risultato oppure None se non viene trovato alcun risultato.

Argomenti

read_policy
Leggi il criterio che specifica il livello desiderato di coerenza dei dati:
STRONG_CONSISTENCY
Garantisce i risultati più recenti, ma limitati a un singolo gruppo di entità.
EVENTUAL_CONSISTENCY
Può comprendere più gruppi di entità, ma a volte restituisce risultati inattivi. In generale, le query a coerenza finale vengono eseguite più velocemente rispetto a quelle a elevata coerenza, ma non c'è alcuna garanzia.

Nota: le query globali (non predecessori) ignorano questo argomento.

scadenza
Tempo massimo, in secondi, di attesa che Datastore restituisca un risultato prima di interrompere con un errore. Accetta un valore intero o in virgola mobile. Non può essere impostato su un valore superiore al valore predefinito (60 secondi), ma può essere modificato verso il basso per garantire che una determinata operazione non vada a buon fine rapidamente (ad esempio per restituire una risposta più rapida all'utente, riprovare a eseguire l'operazione, provare un'operazione diversa o aggiungerla a una coda di attività).
offset
Numero di risultati da saltare prima di restituire il primo.
keys_only
Se true, restituisce solo le chiavi anziché le entità complete. Le query solo chiavi sono più veloci ed economiche di quelle che restituiscono entità complete.
proiezione
Elenco o tupla di nomi delle proprietà da restituire. Verranno restituite solo le entità che possiedono le proprietà specificate. Se non viene specificato, per impostazione predefinita vengono restituite intere entità. Le query di proiezione sono più veloci ed economiche di quelle che restituiscono entità complete.

Nota: se specifichi questo parametro, i requisiti di indice della query potrebbero cambiare.

start_cursor
Posizione del cursore da cui iniziare la query.
end_cursor
Posizione del cursore alla quale terminare la query.
fetch (limit, read_policy=STRONG_CONSISTENCY, deadline=STRONG_CONSISTENCY, offset=STRONG_CONSISTENCY, keys_only=STRONG_CONSISTENCY, projection=STRONG_CONSISTENCY, start_cursor=STRONG_CONSISTENCY, end_cursor=STRONG_CONSISTENCY)

Esegue la query e restituisce un elenco di risultati (possibilmente vuoto):

  1. Recupera e ignora il numero di risultati specificato dall'argomento offset.
  2. Recupera e restituisce il numero massimo di risultati specificato dall'argomento limit.

Il rendimento del metodo scala quindi in modo lineare con la somma di offset + limit.

Nota: questo metodo non è altro che un sottile wrapper per il metodo run() ed è meno efficiente e richiede più memoria rispetto all'utilizzo diretto di run(). Raramente dovrai usare fetch(); viene fornito principalmente per praticità nei casi in cui devi recuperare un elenco completo in memoria dei risultati delle query.

Suggerimento: il metodo fetch() è progettato per recuperare solo il numero di risultati specificato dall'argomento limit. Per recuperare tutti i risultati disponibili di una query quando il loro numero è sconosciuto, utilizza run() con una dimensione del batch elevata, ad esempio run(batch_size=1000), anziché fetch().

Argomenti

limite
Numero massimo di risultati da restituire. Se impostato su None, verranno recuperati tutti i risultati disponibili.
read_policy
Leggi il criterio che specifica il livello desiderato di coerenza dei dati:
STRONG_CONSISTENCY
Garantisce i risultati più recenti, ma limitati a un singolo gruppo di entità.
EVENTUAL_CONSISTENCY
Può comprendere più gruppi di entità, ma a volte restituisce risultati inattivi. In generale, le query a coerenza finale vengono eseguite più velocemente rispetto a quelle a elevata coerenza, ma non c'è alcuna garanzia.

Nota: le query globali (non predecessori) ignorano questo argomento.

scadenza
Tempo massimo, in secondi, di attesa che Datastore restituisca un risultato prima di interrompere con un errore. Accetta un valore intero o in virgola mobile. Non può essere impostato su un valore superiore al valore predefinito (60 secondi), ma può essere modificato verso il basso per garantire che una determinata operazione non vada a buon fine rapidamente (ad esempio per restituire una risposta più rapida all'utente, riprovare a eseguire l'operazione, provare un'operazione diversa o aggiungerla a una coda di attività).
offset
Numero di risultati da saltare prima di restituire il primo.
keys_only
Se true, restituisce solo le chiavi anziché le entità complete. Le query solo chiavi sono più veloci ed economiche di quelle che restituiscono entità complete.
proiezione
Elenco o tupla di nomi delle proprietà da restituire. Verranno restituite solo le entità che possiedono le proprietà specificate. Se non viene specificato, per impostazione predefinita vengono restituite intere entità. Le query di proiezione sono più veloci ed economiche di quelle che restituiscono entità complete.

Nota: se specifichi questo parametro, i requisiti di indice della query potrebbero cambiare.

start_cursor
Posizione del cursore da cui iniziare la query.
end_cursor
Posizione del cursore alla quale terminare la query.
count (read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY, read_policy=STRONG_CONSISTENCY)

Restituisce il numero di risultati corrispondenti alla query. Questo è più veloce di un fattore costante rispetto al recupero effettivo di tutti i risultati, ma il tempo di esecuzione viene comunque scalato in modo lineare con la somma di offset + limit. A meno che non si preveda un conteggio dei risultati ridotto, è meglio specificare un argomento limit; in caso contrario, il metodo continuerà fino al termine del conteggio o al timeout.

Argomenti

read_policy
Leggi il criterio che specifica il livello desiderato di coerenza dei dati:
STRONG_CONSISTENCY
Garantisce i risultati più recenti, ma limitati a un singolo gruppo di entità.
EVENTUAL_CONSISTENCY
Può comprendere più gruppi di entità, ma a volte restituisce risultati inattivi. In generale, le query a coerenza finale vengono eseguite più velocemente rispetto a quelle a elevata coerenza, ma non c'è alcuna garanzia.

Nota: le query globali (non predecessori) ignorano questo argomento.

scadenza
Tempo massimo, in secondi, di attesa che Datastore restituisca un risultato prima di interrompere con un errore. Accetta un valore intero o in virgola mobile. Non può essere impostato su un valore superiore al valore predefinito (60 secondi), ma può essere modificato verso il basso per garantire che una determinata operazione non vada a buon fine rapidamente (ad esempio per restituire una risposta più rapida all'utente, riprovare a eseguire l'operazione, provare un'operazione diversa o aggiungerla a una coda di attività).
offset
Numero di risultati da saltare prima di conteggiare il primo.
limite
Numero massimo di risultati da conteggiare.
start_cursor
Posizione del cursore da cui iniziare la query.
end_cursor
Posizione del cursore alla quale terminare la query.
index_list ()

Restituisce un elenco di indici utilizzati da una query eseguita, inclusi indici primari, composti, di tipo e a proprietà singola.

Attenzione: richiamando questo metodo su una query non ancora eseguita, si verifica un'eccezione AssertionError.

Nota:questa funzionalità non è completamente supportata sul server di sviluppo. Se utilizzato con il server di sviluppo, il risultato è un elenco vuoto o un elenco contenente esattamente un indice composto.

Ad esempio, il seguente codice stampa varie informazioni sugli indici utilizzati da una query:

# other imports ...
import webapp2
from google.appengine.api import users
from google.appengine.ext import db

class Greeting(db.Model):
  author = db.StringProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp2.RequestHandler):
  def get(self):
    user = users.get_current_user()
    q = db.Query(Greeting)
    q.filter("author =", user.user_id())
    q.order("-date")
    q.fetch(100)
    index_list = q.index_list()
    for ix in index_list:
      self.response.out.write("Kind: %s" % ix.kind())
      self.response.out.write("<br />")
      self.response.out.write("Has ancestor? %s" % ix.has_ancestor())
      self.response.out.write("<br />")
      for name, direction in ix.properties():
        self.response.out.write("Property name: "+name)
        self.response.out.write("<br />")
        if direction == db.Index.DESCENDING:
          self.response.out.write("Sort direction: DESCENDING")
        else:
          self.response.out.write("Sort direction: ASCENDING")
        self.response.out.write("<br />")

Questo produce un output come il seguente per ogni indice:

Kind: Greeting
Has ancestor? False
Property name: author
Sort direction: ASCENDING
Property name: date
Sort direction: DESCENDING
cursore ()

Restituisce una stringa cursore codificata in base64 che indica la posizione nel set di risultati della query dopo l'ultimo risultato recuperato. La stringa del cursore può essere utilizzata in sicurezza nei parametri HTTP GET e POST e può anche essere archiviata in Datastore o Memcache. Una chiamata futura della stessa query può fornire questa stringa tramite il parametro start_cursor o il metodo with_cursor() per riprendere il recupero dei risultati da questa posizione.

Attenzione: richiamando questo metodo su una query non ancora eseguita, si verifica un'eccezione AssertionError.

Nota: non tutte le query sono compatibili con i cursori. Per ulteriori informazioni, consulta la pagina Query Datastore.

with_cursor (start_cursor, start_cursor=Nessuno)

Specifica le posizioni iniziali e (facoltativamente) finali all'interno del set di risultati di una query da cui recuperare i risultati. Le stringhe del cursore che indicano le posizioni iniziale e finale possono essere ottenute richiamando cursor() dopo una precedente chiamata alla query. La query corrente deve essere identica a quella precedente, inclusi tipo di entità, filtri proprietà, filtri predecessori e ordinamento.

Argomenti

start_cursor
Stringa del cursore con codifica Base64 che specifica da dove iniziare la query.
end_cursor
Stringa del cursore con codifica Base64 che specifica dove deve terminare la query.