Python 谷歌应用程序引擎-BadArgumentError-don';我不明白为什么

Python 谷歌应用程序引擎-BadArgumentError-don';我不明白为什么,python,google-app-engine,gql,Python,Google App Engine,Gql,我的GAE应用程序中出现了一个错误,我不知道为什么 我有一个实体模型,基本上用作不同实体之间的连接表。我有一些遗留代码,可以迭代该实体的所有实例,以检查(并填充)任何已知漏洞。我一直在慢慢地摆脱它,因为我验证我有其他的错误检查程序,但无法找出这个错误。(如果你从逻辑上考虑,在这一点上它基本上什么都不做,如果不是因为这个错误,我会把它全部删除。) 检查/填充已知孔(缺少ReferenceProperty)的代码设置为任务队列。主处理程序将key() 奇怪的是,日志显示有一个实体实例,但是当我试图删

我的GAE应用程序中出现了一个错误,我不知道为什么

我有一个实体模型,基本上用作不同实体之间的连接表。我有一些遗留代码,可以迭代该实体的所有实例,以检查(并填充)任何已知漏洞。我一直在慢慢地摆脱它,因为我验证我有其他的错误检查程序,但无法找出这个错误。(如果你从逻辑上考虑,在这一点上它基本上什么都不做,如果不是因为这个错误,我会把它全部删除。)

检查/填充已知孔(缺少ReferenceProperty)的代码设置为任务队列。主处理程序将key()

奇怪的是,日志显示有一个实体实例,但是当我试图删除它时,我得到了一个错误。另外,当我在AppEngine数据存储查看器中查找它时

(SELECT * FROM InvestorRoundPair where __key__ = KEY('InvestorRoundPair', 5701213970497536))
它不会返回任何结果

所以看起来没有实际存在的实体实例。。。但不知何故,处理程序仍然能够找到它并将其发送给工人

尽管我在AppEngine中做了很多工作,但我仍然是一个业余爱好者,很可能遗漏了一些非常明显的东西。但也许不是?我真的很想得到一些帮助来了解发生了什么,以及我应该做些什么(如果有的话)来修复它

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
[...]
文件“/base/data/home/apps/s~seed db/1.383964211518800837/investorgraph.py”,第132行,在post中
db.delete(条目)
[...]
BadArgumentError:应为(,)之一;未收到任何(非类型)。

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


在尝试访问其属性或删除它之前,您只需检查
get\u by\u id
是否有效,并且
entry
是否为None。

您是否有日志记录条目变量所包含的内容?
entry=InvestorRoundPair.get\u by\u id(int(objid))
--此处的条目为None,因此,您试图删除一些不存在的内容。但是FillHolesHandler会将InvestorRoundPair的每个实例发送给worker。。。它是否必须存在才能发送给工作人员进行处理?这就是为什么我如此困惑。
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).