【问题标题】:Puzzling App Engine Datastore Issue (ListProperty)令人费解的 App Engine 数据存储区问题 (ListProperty)
【发布时间】:2009-11-23 00:49:51
【问题描述】:

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

当我在本地存储实体时,设置元素类型 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)]

分别在本地和云端。

有什么想法吗?

进一步更新

用硬编码的日期时间 obj 替换了 datetime.now() - 示例过滤器现在看起来像:

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

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

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

有什么想法可能是错的吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      您的确切查询是什么?

      UPDATE知道查询后:

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

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

      这样做有两个问题:

      • 您调用datetime.now() 两次,这可能会给您不同的结果,这将导致一个空的结果集。在同时激活多个线程/执行进程的负载服务器上尤其如此。

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

      你想用这样一对过滤条件达到什么目的?

      【讨论】:

      • 有趣 - 您有使用 Google App Engine 的经验吗?这是过滤特定范围内的日期的推荐模式(ListProperty 和相等性测试) - 来源:appengine-cookbook.appspot.com/attachment/…
      • 虽然我承认对 datetime.now() 的 2 次调用是劣质的,但会改变这一点
      • (仍然不改变查询结果)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多