Creazione e utilizzo delle chiavi di entità

Ogni entità è identificata da una chiave univoca all'interno del Datastore ed è costituito da quanto segue:

  • kind. "kind" è in genere il nome della classe del modello a cui l'entità ma puoi sostituirla con un'altra stringa sostituendo il metodo classmethod _get_kind().
  • identificatore. Puoi specificare il tuo nome della chiave come identificatore oppure Datastore genera automaticamente un ID numerico intero.

Specifica il nome della tua chiave

L'esempio seguente crea implicitamente una chiave con un identificatore di stringa utilizzando il parametro denominato id:

account = Account(
    username='Sandy', userid=1234, email='sandy@example.com',
    id='sandy@example.com')

return account.key.id()  # returns 'sandy@example.com'

In alternativa, puoi impostare direttamente il nome della chiave:

account.key = ndb.Key('Account', 'sandy@example.com')

# You can also use the model class object itself, rather than its name,
# to specify the entity's kind:
account.key = ndb.Key(Account, 'sandy@example.com')

Consentire a Datastore di generare un ID da utilizzare per la chiave

Questo codice mostra come utilizzare un ID generato automaticamente come chiave:

# note: no id kwarg
account = Account(username='Sandy', userid=1234, email='sandy@example.com')
account.put()
# account.key will now have a key of the form: ndb.Key(Account, 71321839)
# where the value 71321839 was generated by Datastore for us.

Utilizzo del percorso predecessore nella chiave

La sequenza di entità che inizia con entità base e prosegue dall'entità padre a figlio, che porta a una determinata entità, costituisce il percorso predecessore di quell'entità. Un'entità, l'elemento principale, l'elemento padre dell'elemento padre e così via in modo ricorsivo, costituiscono antenati. Le entità in Datastore formano uno spazio delle chiavi gerarchico in modo simile alla struttura gerarchica delle directory di un file system.

La chiave completa che identifica un'entità è composta da una sequenza di identificatori di tipo che specifichino il percorso predecessore e terminano con quelli dell'entità per trovare le regole. Il metodo del costruttore per la classe Key accetta una sequenza di tipi e identificatori e restituisce un oggetto che rappresenta la chiave per l'entità corrispondente.

L'esempio seguente mostra un servizio di blogging che archivia i messaggi per revisione. I messaggi sono organizzati in account, mentre le revisioni si trovano sotto i messaggi.

class Revision(ndb.Model):
    message_text = ndb.StringProperty()
...
ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')
ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '2')
ndb.Key('Account', 'larry@example.com', 'Message', 456, 'Revision', '1')
ndb.Key('Account', 'larry@example.com', 'Message', 789, 'Revision', '2')

Nell'esempio, ('Account', 'sandy@example.com'), ('Message', 123) e ('Revision', '1') sono tutti esempi di coppie tipo-identificatore.

Nota che Message non è una classe di modello; serve solo per raggruppare le revisioni, non per archiviare i dati.

Come mostrato nel codice campione, il tipo di entità è indicato dall'attributo ultimo coppia di nome tipo nell'elenco: ndb.Key('Revision', '1').

Utilizzo di parametri con nome

Puoi utilizzare il parametro denominato parent per designare qualsiasi entità nel predecessore percorso personalizzato. Tutte le seguenti notazioni rappresentano la stessa chiave:

ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')

ndb.Key('Revision', '1', parent=ndb.Key(
    'Account', 'sandy@example.com', 'Message', 123))

ndb.Key('Revision', '1', parent=ndb.Key(
    'Message', 123, parent=ndb.Key('Account', 'sandy@example.com')))

Specifica di entità base

Per entità base, il percorso predecessore è vuoto e la chiave è composta esclusivamente da tipo e identificatore dell'entità.

sandy_key = ndb.Key(Account, 'sandy@example.com')

Specifica di un'entità con predecessori

Per inserire un nuovo messaggio con le chiavi principali

account_key = ndb.Key(Account, 'sandy@example.com')

# Ask Datastore to allocate an ID.
new_id = ndb.Model.allocate_ids(size=1, parent=account_key)[0]

# Datastore returns us an integer ID that we can use to create the message
# key
message_key = ndb.Key('Message', new_id, parent=account_key)

# Now we can put the message into Datastore
initial_revision = Revision(
    message_text='Hello', id='1', parent=message_key)
initial_revision.put()

Per le chiavi create con un elemento padre, il metodo parent() restituisce una chiave che rappresentano l'entità padre:

message_key = initial_revision.key.parent()

Utilizzo degli ID dei tasti numerici

Puoi creare un'entità senza specificare un ID; in questo caso il datastore genera automaticamente un ID numerico. Se scegli di specificare alcuni ID e poi permette a Datastore di generare automaticamente alcuni ID, violano il requisito relativo alle chiavi univoche. Per evitare che ciò accada, riserva un intervallo di numeri da utilizzare per scegliere gli ID o utilizzare gli ID delle stringhe per evitare del tutto il problema.

Per prenotare un intervallo di ID, utilizza la classe del modello allocate_ids() Metodo della classe:

  • allo scopo di allocare un numero specifico di ID
  • per allocare tutti gli ID fino a un determinato valore massimo.

Allocazione degli ID

Per allocare 100 ID per una determinata classe di modello MyModel:

first, last = MyModel.allocate_ids(100)

Per allocare 100 ID per le entità con chiave principale p:

first, last = MyModel.allocate_ids(100, parent=p)

I valori restituiti, first e last, sono il primo e l'ultimo ID (inclusi) allocati. Puoi utilizzarli per costruire chiavi nel seguente modo:

keys = [ndb.Key(MyModel, id) for id in range(first, last+1)]

È garantito che queste chiavi non siano state restituite in precedenza dai dati generatore di ID interni dello store, né verranno restituiti da chiamate future al generatore di ID interno. Tuttavia, il metodo allocate_ids() non verifica se gli ID restituiti sono presenti nel datastore; interagisce solo con il generatore di ID.

Per allocare tutti gli ID fino a un determinato valore massimo:

first, last = MyModel.allocate_ids(max=N)

Questo modulo garantisce che tutti gli ID minori o uguali a N vengano presi in considerazione sono state assegnate. I valori restituiti, first e last, indicano l'intervallo di ID riservati da questa operazione. Il tentativo di prenotare gli ID già esistente non è un errore. allocated; In questo caso, first indica il primo ID non ancora allocato e last è l'ultimo ID assegnato.