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})
参见
可裁剪光标¶
这个 tailable 和 await_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")
主机和端口属性将被删除¶
这样的代码:
>>> 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_class , tz_aware 和 uuid_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_request , in_request 和 end_request 被移除。写请求的一致性可能是为了使写请求的一致性更高。此外,请求中的线程将同一成员用于副本集中的所有辅助读取。在默认情况下,不要重写默认的read.0和write.0。
“使用绿色”选项被删除¶
这个 use_greenlets option的意思是允许使用PyMongo和Gevent,而不使用gevent.monkey.patch_线程(). 这个选项造成了很多混乱,并使得它很难支持像Eventlet这样的替代异步库。Gevent的用户应该使用gevent.monkey.patchu全部()而不是。
参见