2011-11-15 41 views
1
qObj = Group.all().fetch(Group.all().count()) 
for g in qObj: 
    self.response.out.write(g.group) 

我有作爲一個輸出,我把所有值和一個值:None作爲NoneType對象之一。我想刪除這個實體。當我嘗試下面的代碼:如何刪除無使用Python在App Engine數據存儲中輸入對象?

qResult = Group.gql('WHERE group=:1', g).get() 
db.delete(qResult) 

我收到錯誤:「BadArgumentError」。 問題是爲什麼我在我的數據存儲中擁有這個實體,如果我很可能沒有添加它的話。如何刪除這個實體?

回答

0

None的返回實際上並不代表數據庫中的實體;這意味着您的查詢沒有返回任何結果。因此,沒有什麼可以從數據庫中刪除。

沒有其他任何事情可以繼續下去,我想冒險猜測你的數據存儲區實際上並不包含任何你認爲存在的類型的實體。

順便說一句,您的初始查詢qObj = Group.all().fetch(Group.all().count())是非常低效的,因爲它會檢索所有的Group實體兩次。運算符實際上獲取了所有實體以對其進行計數。以編程方式維護計數器更爲明智。

+0

引用「這意味着你的查詢沒有返回任何結果」。我得到了一些結果(我放在那裏),最後一個是NoneType對象。爲什麼這個「Group.all()」在最後返回額外的NoneType對象? –

+0

其實,返回值不是None;其中一個返回值的'.group'屬性爲None。我猜猜問題的根源在於Kevin P的建議。不過,感謝您在第一行中提出反模式的觀點。 –

1

很難說沒有看到在完整的上下文你的代碼,但假設你的刪除動作是迭代器內的問題實際上是這樣的語句中:

qResult = Group.gql('WHERE group=:1', g).get() 

你的變量「G」爲集團實體/對象,因此不適合作爲字符串屬性'group'的過濾器,因此不會返回任何結果。這會工作:

qResult = Group.gql('WHERE __key__=:1', g.key()).get() 

但它實際上不是必要單獨查詢該實體(同樣,假設你迭代的初始結果集)。您可以直接刪除它:

g.delete() 

你可能要重新考慮重新命名實體的屬性,因爲它可能會產生混淆的問題。也許是這樣的:

class Group(db.Model): 
    group_name = db.StringProperty() 
相關問題