Python 如何在不返回对象的情况下检查数据存储中是否存在密钥

Python 如何在不返回对象的情况下检查数据存储中是否存在密钥,python,google-app-engine,Python,Google App Engine,我希望能够检查数据存储中是否存在模型的密钥名称。 我的代码是: t=MyModel.get_by_key_name(c) if t==None: #key_name does not exist 我不需要对象,那么有没有一种方法(速度更快、资源成本更低)可以在不返回对象的情况下检查对象是否存在?我只知道密钥名,而不知道密钥。您无法避免通过密钥获取密钥名()或与密钥相关的等价项来检查密钥是否存在。您的代码很好。API讨论了Model.all(keys\u only=Fal

我希望能够检查数据存储中是否存在模型的密钥名称。 我的代码是:

t=MyModel.get_by_key_name(c)
    if t==None:
        #key_name does not exist

我不需要对象,那么有没有一种方法(速度更快、资源成本更低)可以在不返回对象的情况下检查对象是否存在?我只知道密钥名,而不知道密钥。

您无法避免通过密钥获取密钥名()或与密钥相关的等价项来检查密钥是否存在。您的代码很好。

API讨论了
Model.all(keys\u only=False)
在keys\u only设置为True时返回所有键名


查看为此激发的查询,然后您可以编写一个类似于此的查询,但仅针对您的对象,并查看是否提取了任何行。

查询不是更好的选择,即使仅使用键。他们比通过钥匙要慢得多。唯一的性能改进是使用低级数据存储API,但我不建议这样做,因为它更复杂,更难维护。如果我错了,请纠正我,因为我花了30多分钟的时间阅读了所有这些想法,而没有事先的知识或更深入的研究:检索密钥名称的查询比检索对象以查看密钥是否存在更快。此外,get_by_key_name()最终会触发一个查询来检索对象(如果该对象存在)。key_exists()方法应该是API的一部分。我只是建议他/她这样做。datastore.Get和datastore.Query是不同的东西。get_by_key_name()不执行查询——它生成一个键并使用datastore.get,它的速度是datastore.query的几倍,即使它是一个只包含键的查询。查看GET和Quey的等待时间:要考虑的是,在当前的App Engine定价下,一个“代码”> KysSyAuth< /Cord>查询是免费的(这被认为是一个“小操作”),而一个实体读取要花费您的钱。因此,虽然生成键并调用get()可能会更快,但您也必须为此付费。唯一的改进(主要是样式改进)是在t为None时使用
。否则,正如其他答案所说,没有更快或更便宜的方法(或者至少肯定没有一个是干净的、有文档记录的、与未来兼容的——即使是最肮脏的、没有文档记录的把戏也会给你带来难以衡量的收益,因为到商店的往返行程无论如何都会占主导地位,而不是我想象的传输最多几包数据的成本[[如果我想错了,重构模型是值得的;-)]]。