我有一个有趣的问题,只有在升级我的代码才能使用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中发生的事情感到困惑,这会导致它无法正常工作。
答案 0 :(得分:2)
很难解释,基于文件
https://developers.google.com/appengine/docs/python/ndb/keyclass?hl=zh-tw
备忘单 https://docs.google.com/document/d/1AefylbadN456_Z7BZOpZEXDq8cR8LYu7QgI7bt5V0Iw/mobilebasic键支持比较,例如key1 == key2或key1&lt; KEY2。 这些运算符比较应用程序ID,命名空间和完整 “祖先之路”。它们使用与数据存储区用于的相同的顺序 按键属性或按键排序时查询。
和源代码。都表明用法应该没问题。 密钥按顺序对app_id,namesapce和密钥对进行编译。 也许您可以尝试打印(key.app(),key.namespace(),key.pairs())以查看详细信息。
https://code.google.com/p/appengine-ndb-experiment/source/browse/ndb/key.py
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())