2012-09-07 15 views
0

當我嘗試插入包含多個2位小數位數的range_key時,存儲在數據庫中的數字被截斷爲前2個小數位。無法在Boto的DynamoDB中使用range_keys作爲range_keys

我該如何解決這個問題?

max_number = 1000000.0 
    random_time = random.randrange(1, max_number-1)/max_number 
    range_key = int(time.time()) + random_time 
    data['item_id'] = '12345' 
    result = db.add(table='media', key=group_id, 
        range_key = range_key, 
        data=data) 

所得的 「1347053744.819199」 range_key被插入爲 「1347053744.82」

回答

0

UPDATE:

這實際上是在博託一個bug,請參閱https://github.com/boto/boto/pull/890#issuecomment-8456495跟蹤

原來的答案:

爲什麼您使用add來存儲新項目? add是原子增量的函數。您應該使用put_item

我不知道爲什麼你的浮球是圓形的,但無論如何,你真的不應該嘗試它。將float用作鍵是一種不好的做法。因爲它本質上是近似的,所以不可能可靠地檢查花車平等。請參閱http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.html以深入瞭解浮點數。

儘管如此,如果你真的要需要浮點數作爲鍵,你需要完全控制表示,以便在解序列化請求的JSON時不依賴於服務器端實現。你需要用一個普通的字符串替換它。

+0

add()是我寫的一個包裝類的函數。這基本上是put_item。如果range_key是字符串,我可以使用比較運算符嗎? – ensnare

+0

是的,所有這些。包括強大的「BEGINS_WITH」。 http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html – yadutaf

+0

你是真的,這是博託的一個bug:https://github.com/boto/boto/pull/890#issuecomment- 8456495 – yadutaf