2012-09-07 1 views
0

소수점 이하 2 자리 이상을 포함하는 range_key를 삽입하려고하면 데이터베이스에 저장된 숫자가 처음 2 자리 소수로 잘립니다.DynamoDB에서 Boto를 사용하여 float를 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 :

:

이 실제로 BOTO의 버그

,

ORIGINAL 답변을 추적 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

사실이게 boto의 버그입니다. https://github.com/boto/boto/pull/890#issuecomment- 8456495 – yadutaf

관련 문제