Google App Engine - BadArgumentError - 不明白为什么

Google App Engine - BadArgumentError - don't understand why

我在我的 GAE 应用程序中收到 BadArgumentError,我不知道为什么。

我有一个实体模型,我基本上将其用作不同实体之间的连接 table。我有一些遗留代码遍历此实体的所有实例以检查(并填充)任何已知漏洞。我已经慢慢摆脱它,因为我确认我有其他错误检查程序,但无法找出这个错误。 (如果你通过逻辑思考它在这一点上基本上什么都不做,如果不是因为这个错误我会把它全部删除。)

check/fill 已知漏洞(缺少 ReferenceProperties)的代码被设置为任务队列。主处理程序将 key().id() 作为参数发送给工作程序,然后工作程序查找实例,检查它是否具有 ReferenceProperty,如果没有则将其删除。

奇怪的是,日志记录显示 一个实体实例,但是当我尝试删除它时,我得到了 BadArgumentError。此外,当我在 App Engine 数据存储区查看器中查找它时

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

没有 return 任何结果。

所以看起来好像没有实际存在的实体实例...但是处理程序仍然能够以某种方式找到它并将其发送给工作人员?

就我在 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')

Classes/Methods

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).

我怀疑问题出在你的代码不是幂等的。 App Engine 不保证任何特定任务只会执行一次。因此,您的任务有可能 运行,删除实体,然后再次 运行,但找不到它。

在尝试访问它的属性或删除它之前,您应该简单地检查 get_by_id 是否有效并且 entry 不是 None。