3

我有一個有趣的問題,只有在升級我的代碼使用NDB後出現了。的AppEngine/Python的NDB鍵順序

我使用gae-sessions,編碼會話到期時間爲存儲在數據庫中的每個環節的關鍵。例如,一個鍵將具有以下格式:1363968220_6ea52c936f16fc557c0c03a5f276a056其中前10個字符表示當會話到期(值爲1363968220個編碼「2013年3月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事情會導致這種情況無法正常工作。

回答

2

這是很難解釋,基於文檔

https://developers.google.com/appengine/docs/python/ndb/keyclass?hl=zh-tw

按鍵支持的比較,例如KEY1 == KEY2或KEY1 < KEY2。 這些運算符比較應用程序ID,名稱空間,並全面 「祖先路徑」。當通過鍵屬性或鍵排序時,它們使用與數據存儲區用於 查詢相同的順序。

備忘單 https://docs.google.com/document/d/1AefylbadN456_Z7BZOpZEXDq8cR8LYu7QgI7bt5V0Iw/mobilebasic

和源代碼。都顯示使用情況應該沒問題。 按鍵順序依次顯示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())