令人费解的App Engine数据存储问题(ListProperty)

时间:2009-11-23 00:49:51

标签: python google-app-engine google-cloud-datastore listproperty

好的,所以我在本地和gae云中都有相同的python代码。

当我在本地存储实体时,set element type datetime.datetime的ListProperty字段在数据存储区查看器中看起来如此:

2009-01-01 00:00:00,2010-03-10 00:00:00

当我将其存储在云端时,查看器显示:

[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)]

为什么不同的表现形式?

这不会打扰我,只有当我在云上的这个字段上查询时,查询无法找到匹配的实体(它应该并且它在本地执行) - 让我相信这是导致问题的不同表示。我应该重复一遍 - 代码完全相同。

有人想到为什么会发生这种情况并找到解决方案吗?

更新: 我的查询如下(使用过滤器):

from x import y
from datetime import datetime
from google.appengine.ext import db

q = y.EntityType.all().filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now())

usersResult = q.fetch(100)
print `len(usersResult)`

结果应为1,而不是0。

实际上只是具有指定值datetime.datetime的ListProperty才是问题 - 对StringListProperty的查询在云上按预期工作。

我通过本地和云上的交互式控制台尝试了原始过滤器,而云则没有给我带来任何结果。所以它是一个数据存储的东西,我假设它必须与存储格式有关 - 我在ListProperty的两个数据存储区中只有一个实体值,如下所示:

2009-01-01 00:00:00,2010-03-09 00:00:00
[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)]

分别在本地和云端。

有什么想法吗?

进一步更新

将datetime.now()替换为硬编码的datetime obj - 示例过滤器现在看起来像:

y.EntityType.all().filter('displayDateRange <=',datetime(2009,11,24)).filter('displayDateRange >=',datetime(2009,11,24))

注意上面的日期时间ListProperty范围从1.1.2009到3.9.2010这应该返回上面的实体 - 我在localhost dev服务器上尝试了这个相同的过滤器,它就这样做了。云,它与datetime.datetime ListProperty的不同表示形式没有。

请注意,这取自current best practice for filtering on date range

任何想法可能出错?

2 个答案:

答案 0 :(得分:2)

好的长话短说:它现在被归类为app引擎开发服务器版本中的一个错误,并且在生产云数据存储区中不再受支持。

blog post中填写了进一步的解释,请查看第3点。

答案 1 :(得分:1)

您看到的问题显然是在本地情况下转换为字符串(调用__str____unicode__),而数据的表示(repr)显示在云端。但是,打印结果的这种差异不应该是您在云上查询失败的原因。

您的确切查询是什么?

知道查询后

更新

我真的不明白你为什么要使用这些过滤条件:

.filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now())

这有两个问题:

  • 您拨打datetime.now()两次,这可能会给您不同的结果,这会导致结果设置为空。在加载的服务器上尤其如此,其中多个线程/执行进程同时处于活动状态。

  • 您可能要对上述一对过滤器执行的操作是检查是否相等。但是如果datetime.now()返回的datetime实例的精度和数据库中存储的日期时间的精度不同,它将不起作用。一般情况下,在浮点数和亚秒精度时间值的情况下检查相等性并不是一个好主意。

您希望通过这样一对过滤条件实现什么目标?