令人费解的App引擎数据存储问题(ListProperty)
好的,我有相同的python代码在本地和gae云。令人费解的App引擎数据存储问题(ListProperty)
当我在本地存储实体,集合元素类型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)]
为什么表示不同?
这不会打扰我,只有当我在云上查询这个字段查询无法找到匹配的实体(它应该和它在本地) - 让我相信这是不同的表示,导致麻烦。我应该重复 - 代码是相同的。
任何人都认为这是发生的原因和解决办法吗?
UPDATE: 我的查询如下(使用过滤器):
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.1
其实它只是指定值的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)]
本地和云分别。
任何想法?
此外更新
与硬编码日期时间OBJ取代了datetime.now() - 例如过滤器现在看起来像:从2009年1月1日至3.9以上的日期时间的ListProperty范围
y.EntityType.all().filter('displayDateRange <=',datetime(2009,11,24)).filter('displayDateRange >=',datetime(2009,11,24))
注.2010这应该返回上述实体 - 我在localhost dev服务器上尝试了相同的过滤器,并且它是这样做的。云,它与datetime.datetime ListProperty的不同表示不会。
注意这是从current best practice for filtering on date range
任何想法采取了什么地方出错了?
在本地情况下,您看到的问题显然是转换为字符串(称为__str__
或__unicode__
),而您的数据的表示(repr)显示在云上。但是,打印结果的这种差异不应该是您在云上查询失败的原因。
什么是您的确切查询?
UPDATE知道查询后:
我真的不明白为什么要使用这些过滤条件:
.filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now())
有两个问题:
您可以拨打
datetime.now()
两次,这可以给您不同的结果,这会导致一个空的结果集。在多线程/执行进程同时处于活动状态的加载服务器上尤其如此。你可能打算用上面的一对过滤器来检查是否相等。但如果由
datetime.now()
返回的日期时间实例的精度和存储在数据库中的日期时间的精度不同,则它将不起作用。通常在浮点数和亚秒精度时间值的情况下检查相等性不是一个好主意。
你想用这样一对过滤条件实现什么?
更新需要 – rutherford 2009-11-23 12:50:34
有趣的 - 你谷歌应用程序引擎的经验?这是对特定范围内的日期进行过滤的推荐模式(ListProperty and equality test) - source:http://appengine-cookbook.appspot.com/attachment/?id=ahJhcHBlbmdpbmUtY29va2Jvb2tyEQsSCkF0dGFjaG1lbnQY0ygM – rutherford 2009-11-24 13:48:45
尽管我承认2次调用datetime .now()是劣质的,会改变 – rutherford 2009-11-24 13:49:17