Pymongo3迁移指南

pymongo3是一个部分重写,带来了大量的改进。它也带来了一些突破性的变化。本指南提供了将现有应用程序从PyMongo2.x迁移到3.x的路线图,或编写可同时使用PyMongo2.x和3.x的库。

PyMongo 2.9版

任何成功迁移的第一步都需要升级到pymongo2.9,或者至少需要升级到pymongo2.9。如果您的项目有要求.txt文件中,添加一行“pymongo>=2.9,<3.0”,直到完全迁移到pymongo3。pymongo3.0中的大多数关键新方法和选项都在pymongo2.9中进行了后端口移植,使得迁移更加容易。

启用弃用警告

从pymongo2.9开始, DeprecationWarning 由pymongo3.0中删除的大多数方法引发。确保启用运行时警告,以查看应用程序中不推荐使用的函数和方法的位置:

python -Wd <your application>

警告也可以更改为错误:

python -Wd -Werror <your application>

注解

并非所有不推荐使用的功能都会增加 DeprecationWarning 使用时。例如 find() 在pymongo3.0中重命名的选项不会引发 DeprecationWarning 在PyMongo 2.x中使用时。另请参阅 Removed features with no migration path .

积垢API

对find()和findu one()的更改

“spec”重命名为“过滤器”

这个 spec 选项已重命名为 filter . 这样的代码:

>>> cursor = collection.find(spec={"a": 1})

可以在PyMongo 2.9或更高版本中更改为:

>>> cursor = collection.find(filter={"a": 1})

或者任何版本的PyMongo都可以:

>>> cursor = collection.find({"a": 1})

“字段”重命名为“投影”

这个 fields 选项已重命名为 projection . 这样的代码:

>>> cursor = collection.find({"a": 1}, fields={"_id": False})

可以在PyMongo 2.9或更高版本中更改为:

>>> cursor = collection.find({"a": 1}, projection={"_id": False})

或者任何版本的PyMongo都可以:

>>> cursor = collection.find({"a": 1}, {"_id": False})

“部分”重命名为“允许”“部分”“结果”

这个 partial 选项已重命名为 allow_partial_results . 这样的代码:

>>> cursor = collection.find({"a": 1}, partial=True)

可以在PyMongo 2.9或更高版本中更改为:

>>> cursor = collection.find({"a": 1}, allow_partial_results=True)

“超时”替换为“无光标超时”

这个 timeout 选项已被替换为 no_cursor_timeout . 这样的代码:

>>> cursor = collection.find({"a": 1}, timeout=False)

可以在PyMongo 2.9或更高版本中更改为:

>>> cursor = collection.find({"a": 1}, no_cursor_timeout=True)

“网络超时”已删除

这个 network_timeout 选项已删除。对于长时间运行的查询,此选项总是错误的解决方案,因此决不应在生产中使用。从 MongoDB 2.6版 可以使用$maxtimes查询修饰符。这样的代码:

# Set a 5 second select() timeout.
>>> cursor = collection.find({"a": 1}, network_timeout=5)

可以在PyMongo 2.9或更高版本中更改为:

# Set a 5 second (5000 millisecond) server side query timeout.
>>> cursor = collection.find({"a": 1}, modifiers={"$maxTimeMS": 5000})

或者使用PyMongo 3.5或更高版本:

>>> cursor = collection.find({"a": 1}, max_time_ms=5000)

或者任何版本的PyMongo:

>>> cursor = collection.find({"$query": {"a": 1}, "$maxTimeMS": 5000})

参见

$maxTimeMS

可裁剪光标

这个 tailableawait_data 选项已被替换为 cursor_type . 这样的代码:

>>> cursor = collection.find({"a": 1}, tailable=True)
>>> cursor = collection.find({"a": 1}, tailable=True, await_data=True)

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo import CursorType
>>> cursor = collection.find({"a": 1}, cursor_type=CursorType.TAILABLE)
>>> cursor = collection.find({"a": 1}, cursor_type=CursorType.TAILABLE_AWAIT)

其他已删除选项

这个 slave_okay, read_preference, tag_sets, and secondary_acceptable_latency_ms options have been removed. See the Read Preferences 解决方案部分。

聚合方法总是返回一个游标

PyMongo2.6添加了一个选项,用于从 aggregate() . 在PyMongo 3中 aggregate() 始终返回游标。使用 cursor 与PyMongo 2.9及更高版本一致的行为选项:

>>> for result in collection.aggregate([], cursor={}):
...     pass

读取首选项

“slave_okay”选项被删除

这个 slave_okay 选项从PyMongo的API中删除。secondaryPreferred read首选项提供了相同的行为。这样的代码:

>>> client = MongoClient(slave_okay=True)

可以在PyMongo 2.9或更高版本中更改为:

>>> client = MongoClient(readPreference="secondaryPreferred")

“read_preference”属性是不可变的

这样的代码:

>>> from pymongo import ReadPreference
>>> db = client.my_database
>>> db.read_preference = ReadPreference.SECONDARY

可以在PyMongo 2.9或更高版本中更改为:

>>> db = client.get_database("my_database",
...                          read_preference=ReadPreference.SECONDARY)

这样的代码:

>>> cursor = collection.find({"a": 1},
...                          read_preference=ReadPreference.SECONDARY)

可以在PyMongo 2.9或更高版本中更改为:

>>> coll2 = collection.with_options(read_preference=ReadPreference.SECONDARY)
>>> cursor = coll2.find({"a": 1})

“标记集”选项和属性将被删除

这个 tag_sets MongoClient选项已删除。这个 read_preference 可以改为使用选项。这样的代码:

>>> client = MongoClient(
...     read_preference=ReadPreference.SECONDARY,
...     tag_sets=[{"dc": "ny"}, {"dc": "sf"}])

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo.read_preferences import Secondary
>>> client = MongoClient(read_preference=Secondary([{"dc": "ny"}]))

要更改数据库或集合的标记集,请执行以下代码:

>>> db = client.my_database
>>> db.read_preference = ReadPreference.SECONDARY
>>> db.tag_sets = [{"dc": "ny"}]

可以在PyMongo 2.9或更高版本中更改为:

>>> db = client.get_database("my_database",
...                          read_preference=Secondary([{"dc": "ny"}]))

这样的代码:

>>> cursor = collection.find(
...     {"a": 1},
...     read_preference=ReadPreference.SECONDARY,
...     tag_sets=[{"dc": "ny"}])

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo.read_preferences import Secondary
>>> coll2 = collection.with_options(
...     read_preference=Secondary([{"dc": "ny"}]))
>>> cursor = coll2.find({"a": 1})

“secondary_acceptable_latency_ms”选项和属性将被删除

PyMongo 2.x支持 secondary_acceptable_latency_ms 作为整个驱动程序中方法的一个选项,但是mongos只支持全局延迟选项。PyMongo3.x已经进行了更改,以匹配mongos的行为,允许从单个服务器迁移到副本集,再迁移到分片集群,而不会对服务器选择行为产生令人惊讶的改变。一个新的选择, localThresholdMS ,可通过MongoClient获得,并应用于代替 secondaryAcceptableLatencyMS . 这样的代码:

>>> client = MongoClient(readPreference="nearest",
...                      secondaryAcceptableLatencyMS=100)

可以在PyMongo 2.9或更高版本中更改为:

>>> client = MongoClient(readPreference="nearest",
...                      localThresholdMS=100)

写关注点

“安全”选项被删除

在PyMongo 3中 safe 选项将从整个API中删除。 MongoClient 一直默认为已确认的写入操作,并且在PyMongo3中继续这样做。

“写入关注点”属性是不可变的

这个 write_concern 属性在pymongo3中是不可变的。这样的代码:

>>> client = MongoClient()
>>> client.write_concern = {"w": "majority"}

可以用任何版本的PyMongo更改为:

>>> client = MongoClient(w="majority")

这样的代码:

>>> db = client.my_database
>>> db.write_concern = {"w": "majority"}

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo import WriteConcern
>>> db = client.get_database("my_database",
...                          write_concern=WriteConcern(w="majority"))

新的crudapi写入方法不接受写问题选项。这样的代码:

>>> oid = collection.insert({"a": 2}, w="majority")

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo import WriteConcern
>>> coll2 = collection.with_options(
...     write_concern=WriteConcern(w="majority"))
>>> oid = coll2.insert({"a": 2})

编解码器选项

“document_class”属性被删除

这样的代码:

>>> from bson.son import SON
>>> client = MongoClient()
>>> client.document_class = SON

在任何版本的PyMongo中都可以替换为:

>>> from bson.son import SON
>>> client = MongoClient(document_class=SON)

或者改变 document_class 对于一个 Database 使用PyMongo 2.9或更高版本:

>>> from bson.codec_options import CodecOptions
>>> from bson.son import SON
>>> db = client.get_database("my_database", CodecOptions(SON))

“uuid_subtype”选项和属性将被删除

这样的代码:

>>> from bson.binary import JAVA_LEGACY
>>> db = client.my_database
>>> db.uuid_subtype = JAVA_LEGACY

可以用PyMongo 2.9或更高版本替换:

>>> from bson.binary import JAVA_LEGACY
>>> from bson.codec_options import CodecOptions
>>> db = client.get_database("my_database",
...                          CodecOptions(uuid_representation=JAVA_LEGACY))

MongoClient

MongoClient异步连接

在PyMongo 3中 MongoClient 构造函数在连接到一个或多个服务器时不再阻塞,并且不再引发 ConnectionFailure 如果它们不可用,或者 ConfigurationError 如果用户的凭据错误。相反,构造函数立即返回并在后台线程上启动连接进程。这个 connect 选项用于控制这些线程是立即启动还是首次使用客户端。

为了在pymongo2.x和pymongo3.x中保持一致的行为,代码如下:

>>> from pymongo.errors import ConnectionFailure
>>> try:
...     client = MongoClient()
... except ConnectionFailure:
...     print("Server not available")
>>>

可以在PyMongo 2.9或更高版本中更改为:

>>> from pymongo.errors import ConnectionFailure
>>> client = MongoClient(connect=False)
>>> try:
...     result = client.admin.command("ismaster")
... except ConnectionFailure:
...     print("Server not available")
>>>

任何操作都可以用来确定服务器是否可用。我们在这里选择“ismaster”命令是因为它很便宜而且不需要身份验证,所以它是检查服务器是否可用的简单方法。

max_pool_size参数已删除

pymongo3用MongoDB URI支持替换了max_pool_size参数 maxPoolSize 选项。这样的代码:

>>> client = MongoClient(max_pool_size=10)

可以用PyMongo 2.9或更高版本替换:

>>> client = MongoClient(maxPoolSize=10)
>>> client = MongoClient("mongodb://localhost:27017/?maxPoolSize=10")

“断开”方法被删除

这样的代码:

>>> client.disconnect()

可以用PyMongo 2.9或更高版本替换:

>>> client.close()

主机和端口属性将被删除

这样的代码:

>>> host = client.host
>>> port = client.port

可以用PyMongo 2.9或更高版本替换:

>>> address = client.address
>>> host, port = address or (None, None)

BSON

“as_class”、“tz_aware”和“uuid_subtype”将被删除

这个 as_classtz_awareuuid_subtype 参数已从中提供的函数中删除 bson . 此外 encode()decode() 函数作为更高性能的替代品被添加到 bson.BSON.encode()bson.BSON.decode() 方法。这样的代码:

>>> from bson import BSON
>>> from bson.son import SON
>>> encoded = BSON.encode({"a": 1}, as_class=SON)

在PyMongo 2.9或更高版本中可以替换为:

>>> from bson import encode
>>> from bson.codec_options import CodecOptions
>>> from bson.son import SON
>>> encoded = encode({"a": 1}, codec_options=CodecOptions(SON))

删除了没有迁移路径的功能

MasterSlaveConnection已删除

MongoDB中不推荐使用主从部署。从mongodb3.0开始,一个副本集最多可以有50个成员,这个限制很可能会在以后的版本中取消。我们建议改为迁移到副本集。

请求已删除

客户端方法 start_requestin_requestend_request 被移除。写请求的一致性可能是为了使写请求的一致性更高。此外,请求中的线程将同一成员用于副本集中的所有辅助读取。在默认情况下,不要重写默认的read.0和write.0。

“编译”选项被删除

在pymongo3中,正则表达式从不编译为Python匹配对象。

“使用绿色”选项被删除

这个 use_greenlets option的意思是允许使用PyMongo和Gevent,而不使用gevent.monkey.patch_线程(). 这个选项造成了很多混乱,并使得它很难支持像Eventlet这样的替代异步库。Gevent的用户应该使用gevent.monkey.patchu全部()而不是。

参见

Gevent