Luc*_*cas 3 mongodb python-2.7
我想在保存到MongoDB之前使用操纵器将十进制转换为float.数据来自SQL Server数据库,我使用基于freeTDS的pymssql导入.
我按照MongoDB文档的说明操作,但我一直收到错误:
File "build\bdist.win32\egg\pymongo\collection.py", line 467, in insert_one
File "build\bdist.win32\egg\pymongo\collection.py", line 430, in _insert
bson.errors.InvalidDocument: Cannot encode object: Decimal('5019.13')
Run Code Online (Sandbox Code Playgroud)
这是我的转换代码:
import decimal
class Transform(SONManipulator):
def transform_incoming(self, son, collection):
for (key, value) in son.items():
if isinstance(value, decimal.Decimal):
son[key] = float(value)
elif isinstance(value, dict):
son[key] = self.transform_incoming(value, collection)
return son
Run Code Online (Sandbox Code Playgroud)
在哪里我将它添加到db:
def get(collection):
client = MongoClient(uri)
db = client[database]
db.add_son_manipulator(Transform())
return db[collection]
Run Code Online (Sandbox Code Playgroud)
当我打电话的时候
collection = get('mycollection')
collection.insert_one(object)
Run Code Online (Sandbox Code Playgroud)
根据MongoDB Changelog,自MongoDB 3.0以来,SONManipulator API已被弃用,不适用于db.insert_one():
SONManipulator API作为一种转换数据的技术存在局限性.相反,在将传出文档传递给PyMongo之前,在您自己的代码中转换传出文档更加灵活和直接,并在从PyMongo接收传入文档后对其进行转换.
因此不推荐使用add_son_manipulator()方法.PyMongo 3的新CRUD API不会将SON操纵器应用于传递给bulk_write(),insert_one(),insert_many(),update_one()或update_many()的文档.SON操纵器不适用于新方法find_one_and_delete(),find_one_and_replace()和find_one_and_update()返回的文档.
然而它会起作用db.insert(),但它也被弃用了.
因此,最好在应用代码和数据库之间的边界上编写自定义转换器.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |