AppEngine/Python NDB密钥顺序

AppEngine/Python NDB密钥顺序,python,google-app-engine,google-cloud-datastore,gae-sessions,Python,Google App Engine,Google Cloud Datastore,Gae Sessions,我有一个有趣的问题,只有在将代码升级到使用NDB之后才出现 我使用的是,它将会话到期时间编码到存储在数据库中的每个会话的密钥中。例如,密钥的格式如下:1363968220_6ea52c936f16fc557c0c03a5f276a056,其中前10个字符表示会话到期时的时间戳(值1363968220编码为“2013-03-22 16:03:40”) 在升级到NDB之前,删除过期会话的代码工作正常。升级后,代码会错误地删除尚未过期的会话。代码如下: time_time = time.time()

我有一个有趣的问题,只有在将代码升级到使用NDB之后才出现

我使用的是,它将会话到期时间编码到存储在数据库中的每个会话的密钥中。例如,密钥的格式如下:1363968220_6ea52c936f16fc557c0c03a5f276a056,其中前10个字符表示会话到期时的时间戳(值1363968220编码为“2013-03-22 16:03:40”)

在升级到NDB之前,删除过期会话的代码工作正常。升级后,代码会错误地删除尚未过期的会话。代码如下:

time_time = time.time()
now_str = unicode(int(time_time))
now_str_datetime = datetime.datetime.fromtimestamp(time_time) 
q = SessionModel.query(namespace='')
key = ndb.Key(SessionModel, now_str + u'\ufffd', namespace='')
logging.info("Deleting sessions with key values less than %s [%s]" % (key, now_str_datetime))
q.filter(SessionModel._key < key)
results = q.fetch(500, keys_only=True)
# This is for debugging purposes
for r_key in results:
    logging.warning("Deleting key %s" % (r_key))

如果这些键被视为字符串(使用字符串顺序/优先规则),则删除的键(从1363924467开始)不应被视为小于我们筛选的键(从1363362698开始),因此,我对NDB中发生的会导致其无法正常工作的情况感到困惑。

根据文档,很难解释

键支持比较,例如key1==key2或key1 备忘单

和源代码。所有这些都表明使用应该是可以的。 密钥按顺序排列应用程序id、名称和密钥对。 也许您可以尝试打印(key.app()、key.namespace()、key.pairs())以查看详细信息

Deleting sessions with key values less than Key('SessionModel', '1363362698\xef\xbf\xbd') [2013-03-15 15:51:38.767947]
Deleting key Key('SessionModel', '1363924467_e0240e38b4047ef821ac62e07466351b')
def __gt__(self, other):
    """Greater than ordering."""
    if not isinstance(other, Key):
      return NotImplemented
    return self.__tuple() > other.__tuple()

def __tuple(self):
    """Helper to return an orderable tuple."""
    return (self.app(), self.namespace(), self.pairs())