Python:将 MongoDB 迁移到 DynamoDB - 浮点错误

Jam*_*mes 1 python mongodb amazon-dynamodb

我开始在日常家务中使用 Python,我发现了一个我无法解决的问题。有了这个脚本,只修改集合名(MongoDB)和表名(DynamoDB),整个过程在其他集合中运行的非常好。

在一个集合中(下面的例子),脚本执行得不是很好,因为集合中有浮动数据,比如地理定位数据

import sys

# Mongo
import pprint
from pymongo import MongoClient
Client = MongoClient('mongodb://localhost:27017/')
db = Client["developer"]
collection = db["geolocation"]

# Dynamo
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('geolocation')


# migrate
count = 0
with table.batch_writer() as batch:
    for migrate in collection.find():
        del migrate['__v']
        del migrate['_id']

        batch.put_item(Item= migrate)

        # To show process
        count += 1
        print(str(collection.count()) + '::' + str(count))
Run Code Online (Sandbox Code Playgroud)

发生的错误是:不支持浮点类型。改用十进制类型

我需要帮助创建一个 def 来扫描对象并将 float 的值替换为小数。有人能帮我吗?

小智 5

当项目通过 boto3 上传时,DynamoDB 需要十进制格式的浮点数。

您需要将 MongoDB 字典中的所有浮点数替换为 Decimal。

首先,将python字典转换回JSON

import json
migrate_json = json.dumps(migrate)
Run Code Online (Sandbox Code Playgroud)

然后,将 JSON 解析回 python 字典,浮点数存储为十进制。

from decimal import Decimal
migrate = json.loads(migrate_json, parse_float=Decimal)
Run Code Online (Sandbox Code Playgroud)

现在上传将工作

batch.put_item(Item=migrate)
Run Code Online (Sandbox Code Playgroud)