我有一个有趣的问题,仅在升级我的代码以使用 NDB 后才出现。
我正在使用gae-sessions,它将会话到期时间编码为存储在数据库中的每个 Session 的密钥。例如,密钥将具有以下格式: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))
这将产生以下输出:
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')
如果这些键被视为字符串(使用字符串排序/优先规则),那么被删除的键(以 1363924467 开头)不应被视为小于我们要过滤的键(以 1363362698 开头),所以我是对 NDB 中发生的事情感到困惑,这会导致它无法正常工作。