2012-01-05 19 views
8

Ho bisogno di iterare ed eliminare tutti i record del mio archivio dati. Sto utilizzando Google Launcher del motore di app per testarlo sull'host locale. Come farlo?Come cancellare un record usando GQL?

Quando sto cercando di eliminare tutti recors nel modello di persona in questo modo:

qObj = Person.all() 
db.delete(qObj) 

sto errore BadValueError: Property y must be a str or unicode instance, not a long ottenendo Credo che ci sia un conflitto in tipi di dati di modello.

class Person(db.Model): 
    name = db.StringProperty() 
    x = db.StringProperty() 
    y = db.StringProperty() 
    group = db.StringProperty() 

Il campo y = db.StringProperty() in precedenza era y = db.IntegerProperty(). In questo momento ho bisogno di scaricare tutti i record db. Come lo posso fare?

C'è un'opportunità per eliminare il file locale che memorizza tutti i record db?

+0

Quando si esegue qObj = Person.all(), si imposta qObj su un elenco di oggetti Person. Per quanto ne so, non è possibile chiamare la cancellazione in quella lista: è necessario scorrere l'elenco ed eliminare ciascun oggetto separatamente. – pinerd314159

+0

http://code.google.com/appengine/docs/python/datastore/functions.html#create_config ... delete (modelli) Elimina una o più istanze del modello dal datastore. Argomenti: modelli Un'istanza di modello, una chiave per un'entità o un elenco (o altro iterabile) di istanze di modello o chiavi di entità da eliminare. –

+0

Ho appena provato ['db.delete (Person.all())'] (https://developers.google.com/appengine/docs/python/datastore/functions # delete), usando il tuo esatto modello 'Persona', e funziona perfettamente (cancella tutti gli oggetti' Person' da db) – bobobobo

risposta

8

La lingua GQL può essere utilizzato solo per recuperare le entità o chiave (cfr http://code.google.com/appengine/docs/python/datastore/gqlreference.html)

Dovrete fare questo:

persons = Person.all() 

for p in persons: 
    p.delete() 

Per quanto riguarda l'errore BadValueError: Property y must be a str or unicode instance, not a long, dovrete modificare tutti i dati (da numero intero a stringa) nel database per risolvere il conflitto.

Sembra che si desideri eliminare tutto, quindi un'altra soluzione sarebbe semplicemente andare alla pagina di amministrazione del datastore - http://localhost:8080/_ah/admin su localhost o tramite https://appengine.google.com/ - e rimuovere tutto.

Si potrebbe rivelarsi utile: http://code.google.com/appengine/articles/update_schema.html

+0

Questo __non è corretto__. Non hai bisogno dell'esplicita 'for'. Questo è stato risolto o qualcos'altro era sbagliato – bobobobo

1

Se si dispone di una variabile che memorizza un record nel database, è possibile utilizzare semplicemente delete().

Cioè, supponiamo di avere un'entità chiamata persone, si può fare:

personToDelete = db.GqlQuery("SELECT * FROM Persons WHERE name='Joe'"); 
person = personToDelete[0]; 
person.delete(); 

Dovete anche per importare la libreria di database, ma sto assumendo lo fai in ogni caso dato che sei chiaramente usando il database.

+0

Questo ci dà un errore: l'oggetto 'Query' non supporto indicizzazione. Cosa ci manca? – Praxiteles

0

solo per condividere una suggerimenti utili sulla risposta già accettato.

è possibile effettuare le seguenti operazioni con db.delete:

persons = Person.all() 
d = [] 
for p in persons: 
    d.append(p) 

db.delete(d) 

questo consente di risparmiare un sacco di operazioni db.

+0

Penso che questo sia molto inefficiente. Stai creando un intero altro array, ma non è necessario. – bobobobo

+0

Questo ha dato un errore "AttributeError: 'list' l'oggetto non ha attributo 'delete'" Suggerimenti? – Praxiteles