2012-01-05 13 views
8

Potrzebuję do iteracji i usuwania wszystkich rekordów mojego magazynu danych. Używam Launchera wyszukiwarki aplikacji Google do testowania go na hoście lokalnym. Jak to zrobić?Jak usunąć rekord za pomocą GQL?

Gdy próbuję usunąć wszystkie recors osoba model w ten sposób:

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

Dostaję błąd BadValueError: Property y must be a str or unicode instance, not a long Chyba istnieje konflikt typów danych modelu.

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

Pole y = db.StringProperty() poprzednio był y = db.IntegerProperty(). W tej chwili muszę opróżnić wszystkie rekordy db. Jak mogę to zrobić?

Czy istnieje możliwość usunięcia pliku lokalnego, który przechowuje wszystkie rekordy db?

+0

Kiedy robisz qObj = Person.all(), ustawiasz qObj na listę obiektów Person. O ile mi wiadomo, nie można wywołać polecenia delete na tej liście - należy wykonać iterację na liście i usunąć każdy obiekt osobno. – pinerd314159

+0

http://code.google.com/appengine/docs/python/datastore/functions.html#create_config ... delete (modele) Usuwa jedną lub więcej instancji modelu ze składnicy danych. Argumenty: modele modele Instancja modelowa, klucz encji lub lista (lub inne iterowalne) wystąpień modelu lub klucze podmiotów do usunięcia. –

+0

Po prostu próbowałem ['db.delete (Person.all())'] (https://developers.google.com/appengine/docs/python/datastore/functions # delete), używając twojego dokładnego modelu "Person" i działa idealnie (usuwa wszystkie obiekty "Person" z db) – bobobobo

Odpowiedz

8

Językiem GQL może być używany tylko do pobierania podmioty lub (por http://code.google.com/appengine/docs/python/datastore/gqlreference.html)

będziesz musiał to zrobić:

persons = Person.all() 

for p in persons: 
    p.delete() 

Odnośnie błędu BadValueError: Property y must be a str or unicode instance, not a long, musisz zmodyfikuj wszystkie dane (z liczby całkowitej na ciąg) w bazie danych, aby rozwiązać konflikt.

Wygląda na to, że chcesz usunąć wszystko, więc innym rozwiązaniem będzie po prostu przejście do strony administracyjnej magazynu danych - http://localhost:8080/_ah/admin na localhost lub poprzez - i usunięcie wszystkiego.

Można znaleźć to przydatne: http://code.google.com/appengine/articles/update_schema.html

+0

To jest __nie prawidłowa__. Nie potrzebujesz wyraźnego 'for'. To było albo naprawione albo coś innego było nie tak – bobobobo

1

Jeśli masz zmienną, która przechowuje rekord w bazie danych, możesz po prostu użyć polecenia delete().

Oznacza to, że masz Podmiotem zwane ludźmi, można zrobić:

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

Trzeba również importować bibliotekę bazy danych, ale jestem przy założeniu, że ty i tak biorąc pod uwagę, że jesteś wyraźnie używając bazy danych.

+0

Daje nam to błąd: obiekt "Zapytanie" nie indeksowanie wsparcia. Czego nam brakuje? – Praxiteles

0

Wystarczy podzielić się przydatne wskazówki na już zaakceptowanej odpowiedzi.

można wykonać następujące czynności z db.delete:

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

db.delete(d) 

Oszczędza to wiele operacji DB.

+0

Myślę, że to bardzo nieefektywne. Tworzysz całą inną tablicę, ale nie musisz. – bobobobo

+0

Dało to błąd "AttributeError:" obiekt listy nie ma atrybutu "usuń" "Sugestie? – Praxiteles

Powiązane problemy