Python:将MongoDB迁移到DynamoDB - float error



我开始在日常琐事中使用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))

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

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

DynamoDB 要求通过 boto3 上传项目时浮点数采用十进制格式。

您需要在MongoDB的字典中用十进制替换所有浮点数。

首先,将python字典转换回JSON

import json
migrate_json = json.dumps(migrate)

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

from decimal import Decimal
migrate = json.loads(migrate_json, parse_float=Decimal)

现在上传将起作用

batch.put_item(Item=migrate)

这个def解决了问题

def replace_float(obj):
if isinstance(obj, list):
for i in xrange(len(obj)):
obj[i] = replace_float(obj[i])
return obj
elif isinstance(obj, dict):
for k in obj.iterkeys():
obj[k] = replace_float(obj[k])
return obj
elif isinstance(obj, float):
if obj % 1 == 0:
return int(obj)
else:
return Decimal(str(obj))
else:
return obj

所以,替换...

newItem=replace_float(migrate)
batch.put_item(Item=newItem)

最新更新