2015-05-01 28 views
1

我在我的GAE應用程序中收到BadArgumentError,我無法弄清楚原因。谷歌應用程序引擎 - BadArgumentError - 不明白爲什麼

我有一個實體模型,我基本上用作不同實體之間的連接表。我有一些遺留代碼遍歷這個實體的所有實例來檢查(和填充)任何已知的漏洞。我已經慢慢擺脫它了,因爲我確認我已經有了其他的錯誤檢查程序,但是無法找出這個錯誤。 (如果你認爲通過邏輯它在這一點上基本上什麼也不做,如果不是這個錯誤,我會把它全部刪除。)

檢查/填充已知孔(缺少ReferenceProperties)的代碼已設置作爲任務隊列。主處理程序將key()。id()作爲參數發送給worker,然後查找實例,檢查它是否具有該ReferenceProperty,如果沒有,則刪除它。

奇怪的是,日誌記錄顯示是一個Entity實例,但是當我嘗試刪除它時,我得到一個BadArgumentError。此外,當我在App Engine數據存儲查看器上查找它時,它不返回任何結果

(SELECT * FROM InvestorRoundPair where __key__ = KEY('InvestorRoundPair', 5701213970497536)) 

它不返回任何結果。

所以它看起來像沒有實際存在的實體...但不知何故處理程序仍然能夠找到它並將其發送給工人?

就像我在App Engine中所做的一樣,我仍然非常地是一個業餘愛好者,可能會錯過一些非常明顯的東西。但也許不是?我真的很想幫助我們瞭解正在發生的事情以及我應該如何解決這個問題。

models.py

class InvestorRoundPair(db.Model): 
    investor = db.ReferenceProperty(SeedInvestor, collection_name = 'investorgroup') 
    funding_round = db.ReferenceProperty(FundingRound, collection_name = 'fundingroundgroup') 
    accelerator_entry = db.ReferenceProperty(SeedAccelerator, collection_name = 'acceleratorgroup') 
    company_entry = db.ReferenceProperty(SeedCompany, collection_name = 'companygroup') 

類/方法

class FillHolesHandler(handlers.BaseRequestHandler): 
    def get(self): 
     listofholes = InvestorRoundPair.all().order('-funding_round') 
     for entry in listofholes: 
      objid = entry.key().id() 
      taskqueue.add(url='/investorgraph/graphholefiller', params={'objid': objid}, queue_name='holefiller') 

class GraphHoleFillerWorker(handlers.BaseRequestHandler): 
    def post(self): 
     objid = self.request.get('objid') 
     entry = InvestorRoundPair.get_by_id(int(objid)) 
     logging.info('InvestorRoundPair %s', objid) 
     try: 
      fundingroundkey = entry.funding_round.key().id() 
     except AttributeError: 
      db.delete(entry) 

錯誤

InvestorRoundPair 5701213970497536 
[...] 
File "/base/data/home/apps/s~seed-db/1.383964211518800837/investorgraph.py", line 132, in post 
    db.delete(entry) 
[...] 
BadArgumentError: Expected one of (<type 'basestring'>, <class 'google.appengine.api.datastore.Entity'>, <class 'google.appengine.api.datastore_types.Key'>); received None (a NoneType). 
+1

你有日誌什麼入口變量持有? –

+0

'entry = InvestorRoundPair.get_by_id(int(objid))' - 這裏的條目是None,所以你試圖刪除一些不存在的東西。 –

+0

但是FillHolesHandler會將每個InvestorRoundPair實例發送給工作人員......它是否存在才能將其發送給工作人員進行處理?這就是爲什麼我很困惑。 –

回答

1

我懷疑,問題是,你的代碼是不是冪等。 App Engine不保證任何特定任務只能執行一次。因此,您的任務可能會運行,刪除實體,然後再次運行並且無法找到它。

在嘗試訪問其屬性或刪除它之前,您應該檢查get_by_id的工作方式和entry的方法是否爲無。