PyMongo由于事务而无法更新MongoDB

我对Python或MongoDB没有真正的经验,但是我正在使用this script从数据库中迁移一些文件。 当update_one命令在第190行运行时发生错误:

collection.update_one({"_id": dbId},{"$set": update_data})

pymongo.errors.OperationFailure: Transaction numbers are only allowed on storage engines that support document-level locking

这似乎是因为它正在尝试使用事务,并且由于我们只有一个MongoDB,因此它不支持事务(根据我的阅读)。

我检查了该行上使用的变量,它们看起来都不错,所以现在我有点卡住了。

理想情况下,我希望当您连接到数据库时,有一种方法可以说“不使用事务”。任何帮助或指示,将不胜感激。

更多信息:

# python3 -V Python 3.6.8

# mongod --version db version v4.0.10 git version: c389e7f69f637f7a1ac3cc9fae843b635f20b766 OpenSSL version: OpenSSL 1.1.1 11 Sep 2018 allocator: tcmalloc modules: none build environment: distmod: ubuntu1804 distarch: x86_64 target_arch: x86_64

XXQJING 回答:PyMongo由于事务而无法更新MongoDB

您正在从csv的164行读取集合名称,并且在172行分配了集合。您正在尝试在190行更新文档。

两个集合的原子更新实际上是一项事务。从版本4.0开始,MongoDB从版本4.0开始不支持跨集合或什至不支持集合中的事务。您应该使用事务进行多馆藏更新。查看docs示例以了解操作方法。

,

如果您使用PyMongo v3.9.0并将MongoDB与MMAPv1 storage engine一起使用,则必须显式禁用retryable writes,以避免在写操作期间遇到pymongo.errors.OperationFailure异常。您可以使用以下任一方法禁用它:

  • 通过连接字符串例如MongoClient(“ mongodb://my.mongodb.cluster/db?retryWrites = false”)
  • 通过MongoClient构造函数的关键字参数,例如MongoClient(“ mongodb://my.mongodb.cluster/db”,retryWrites = False)

这是因为不建议使用MMAPv1存储引擎,并且不支持retryable写操作,自PyMongo v3.9.0起,默认情况下已将它们打开。

我还建议您升级/切换您的MongoDB服务器以使用WiredTiger Storage Engine(自MongoDB v3.2起是默认设置,将从MongoDB v4.2开始将其删除)。有关如何更改存储引擎的教程,请参阅:

本文链接:https://www.f2er.com/3102666.html

大家都在问