2012-01-05 7 views
8

Necesito iterar y eliminar todos los registros de mi almacén de datos. Estoy usando el Lanzador de motores de aplicaciones de Google para probarlo en el host local. ¿Cómo hacerlo?¿Cómo eliminar un registro usando GQL?

Cuando estoy tratando de eliminar todos los recors en el modelo de persona de esa manera:

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

estoy error BadValueError: Property y must be a str or unicode instance, not a long recibiendo supongo que hay un conflicto en los tipos de datos del modelo.

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

El campo y = db.StringProperty() anteriormente era y = db.IntegerProperty(). En este momento necesito eliminar todos los registros de db. ¿Cómo puedo hacer eso?

¿Existe la posibilidad de eliminar el archivo local que almacena todos los registros de db?

+0

Cuando hace qObj = Person.all(), está configurando qObj en una lista de objetos Person. Por lo que yo sé, no puede llamar a eliminar en esa lista; debe recorrer la lista y eliminar cada objeto por separado. – pinerd314159

+0

http://code.google.com/appengine/docs/python/datastore/functions.html#create_config ... delete (modelos) Elimina una o más instancias del modelo del almacén de datos. Argumentos: modelos Una instancia de modelo, una clave para una entidad o una lista (u otra iterable) de instancias de modelo o claves de entidades para eliminar. –

+0

Acabo de probar ['db.delete (Person.all())'] (https://developers.google.com/appengine/docs/python/datastore/functions # delete), usando su modelo 'Person' exacto, y funciona perfectamente (borra todos los objetos' Person' de db) – bobobobo

Respuesta

8

El lenguaje GQL sólo se puede utilizar para recuperar o entidades clave (cf. http://code.google.com/appengine/docs/python/datastore/gqlreference.html)

Vas a tener que hacer esto:

persons = Person.all() 

for p in persons: 
    p.delete() 

En cuanto al error BadValueError: Property y must be a str or unicode instance, not a long, que tendrá que modifique todos los datos (de un entero a una cadena) en la base de datos para resolver el conflicto.

Parece que desea eliminar todo, por lo que otra solución sería ir a la página de administración del almacén de datos - http://localhost:8080/_ah/admin en localhost o por https://appengine.google.com/ - y eliminar todo.

Usted puede encontrar esto útil: http://code.google.com/appengine/articles/update_schema.html

+0

Esto no es correcto__. No necesita el 'for' explícito. Esto fue arreglado o algo más estaba mal – bobobobo

1

Si tiene una variable que almacena un registro en la base de datos, puede simplemente usar delete().

Es decir, supongamos que tiene una entidad llamada Las personas, que puede hacer:

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

Usted también tiene que importar la biblioteca de base de datos, pero estoy suponiendo que lo hace de todos modos teniendo en cuenta que estás claramente usando la base de datos.

+0

Esto nos da un error: el objeto 'Query' no indexación de soporte. ¿Qué nos estamos perdiendo? – Praxiteles

0

sólo para compartir un útil consejos sobre la respuesta ya aceptada.

Usted puede hacer lo siguiente con db.delete:

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

db.delete(d) 

Esto ahorra una gran cantidad de operaciones db.

+0

Creo que esto es muy ineficiente. Está creando una matriz entera diferente, pero no necesita hacerlo. – bobobobo

+0

Esto dio un error "AttributeError: 'list' objeto no tiene atributo 'eliminar'" ¿Sugerencias? – Praxiteles

Cuestiones relacionadas