2012-12-17 33 views
1

這裏是我的困境:我必須通過實體列表來檢查是否有一些重複屬性(我正在使用NDB)是空的。如果是,那麼我給它賦值並且put()。否則,我跳過實體。我試圖在Google應用引擎附帶的遠程登錄shell中執行所有這些操作。在Google App Engine的remote_api_shell.py中檢索和寫入實體時出錯

我已經嘗試過遍歷Model.query(),執行條件和寫入值,但是當我開始寫入過程會掛起。當我終於按Ctrl-C時,它彈出一個錯誤說:「assert response.set_status_size()== len(server_keys); AssertionError」。我假設這與它嘗試檢索的實體的大小有關。任何人都知道發生了什麼?這裏是我當前的代碼:

>>> for entity in Model.query(): 
... if not len(entity.references): 
...  entity.references = somevalue 
...  continue 
... print 'skipped' 

我只想過濾查詢,而不是使用if聲明的,但我不知道如何通過重複屬性的長度來過濾查詢。

回答

1

,當它找到的第一個實體沒有引用(或者打印skipped如果有這樣的沒有),但它可能會留下一些實體沒有任何引用的代碼示例的回報。我不知道這是你的意圖。

如果引用的只有少數值是可能的,例如:[「蟒蛇」,「紅寶石」,「PHP」],我想你可以做一個Repeated Properties查詢像Model.query(Model.references.IN(['python', 'ruby', 'php']))),採取列表的差異與名單所有實體,並遍歷剩餘的實體。 (我不知道很多NDB,並懷疑這是一般的好方法,但預計它會工作確定了一些數據集。)

+0

哎呦!我打算把「繼續」。感謝您的支持。不幸的是,我不認爲這個過濾器適用於我的情況。 – Harrison

3

多少實體,你呢?如果你有100多個,那麼從遠程API查詢的效率是非常低的(二次方)。所以這可能解釋它掛起。

你是對的,你不能寫一個查詢檢測你正在尋找的條件。

1

我終於搞定了!我使用query.fetch_page來批量提取查詢,然後迭代每批並應用更改。

>>> more = True 
>>> cursor = None 
>>> while more: 
...  batch, cursor, more = MyModel.query().fetch_page(50, start_cursor=cursor) 
...  for entity in batch: 
...   if not len(entity.references): 
...    entity.references = somevalue 
...    entity.put() 
...  print "finished batch" 
相關問題