【问题标题】:Unable to insert floats as range_keys in DynamoDB with Boto无法使用 Boto 在 DynamoDB 中将浮点数作为 range_keys 插入
【发布时间】:2012-09-11 21:40:32
【问题描述】:

当我尝试插入包含多于 2 位小数的 range_key 时,存储在数据库中的数字被截断为前 2 位小数。

我该如何解决这个问题?

    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”

【问题讨论】:

    标签: python boto amazon-dynamodb


    【解决方案1】:

    更新:

    这其实是boto中的一个bug,追踪见https://github.com/boto/boto/pull/890#issuecomment-8456495

    原始答案:

    您为什么使用add 来存储新项目? add 是原子增量的函数。你应该改用put_item

    我不知道为什么你的浮点数是圆形的,但无论如何,你真的不应该尝试它。使用浮点数作为键是一种不好的做法。不可能可靠地检查浮点数是否相等,因为它们本质上是近似值。请参阅 http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.html 以深入了解浮点数。

    尽管如此,如果你真的需要浮点数作为键,你需要完全控制那里的表示,以便在反序列化请求的 JSON 时不依赖于服务器端的实现。您需要将其替换为常规字符串。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多