Página inicial do Docs → Desenvolver aplicações → Drivers Python → PyMongo
Atualizar versões do PyMongo
Visão geral
Esta página descreve as alterações que você deve fazer no seu aplicativo ao atualizar para uma nova versão do PyMongo.
Importante
Este guia inclui alterações significativas apenas nas versões do PyMongo após a v4.0. Se você estiver atualizando do PyMongo v2 ou v3, consulte o Guia de Migração do PyMongo .4
Antes de atualizar, execute as seguintes ações:
Certifique-se de que a nova versão do PyMongo seja compatível com as versões do MongoDB Server às quais seu aplicação se conecta e com a versão do Python em que seu aplicação é executado. Para obter informações sobre compatibilidade de versão, consulte a página Compatibilidade do PyMongo .
Resolva quaisquer alterações significativas entre a versão do driver que seu aplicativo está usando e a versão de atualização planejada na seção Alterações significativas.
Dica
Para minimizar o número de alterações que seu aplicação exige ao atualizar as versões do driver no futuro, use a Stable API.
Mostrar avisos de depreciação
Quando você usa um recurso obsoleto do PyMongo, o driver levanta um DeprecationWarning
. Por padrão, o interpretador Python silencia esses avisos. Para imprimi-las no stderr
, inicie o Python com as opções -Wd
.
O exemplo a seguir executa insert.py
, um aplicativo Python que chama um método obsoleto. O interpretador mostra um DeprecationWarning
porque o Python foi iniciado com as opções -Wd
.
$ python3 -Wd insert.py insert.py:4: DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead. client.test.test.insert({})
Para tratar DeprecationWarning
mensagens como exceções, inicie o Python com as opções -We
, conforme mostrado no exemplo a seguir:
$ python3 -We insert.py Traceback (most recent call last): File "insert.py", line 4, in <module> client.test.test.insert({}) File "/home/durin/work/mongo-python-driver/pymongo/collection.py", line 2906, in insert "instead.", DeprecationWarning, stacklevel=2) DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.
Mudanças de última hora
Uma alteração significativa é uma alteração de uma convenção ou comportamento a partir de uma versão específica do driver. Esse tipo de alteração pode impedir que seu aplicativo funcione corretamente se não for resolvido antes de atualizar o driver.
As alterações interruptivas nesta seção são categorizadas pela versão do driver que as introduziram. Ao atualizar as versões do driver, resolva todas as alterações interruptivas entre a versão atual e a atualizada.
Exemplo
Atualização da versão 4.0
Se você estiver atualizando o PyMongo da v4.0 para a v4.7, resolva todas as alterações significativas listadas para as versões 4.1 a 4.7, se houver.
Versão 4.7: mudanças importantes
Todas as ocorrências do tipo de coleção
SON
em todas as classes e comandos internos foram alteradas paradict
.A propriedade
options.pool_options.metadata
agora é do tipodict
, nãoSON
. O seguinte exemplo de código mostra as diferenças em como estes formatos armazenam dados:
# Before (SON) from pymongo import MongoClient client = MongoClient() client.options.pool_options.metadataSON([('driver', SON([('name', 'PyMongo'), ('version', '4.7.0.dev0')])), ('os', SON([('type', 'Darwin'), ('name', 'Darwin'), ('architecture', 'arm64'), ('version', '14.3')])), ('platform', 'CPython 3.11.6.final.0')]) # After (dict) client.options.pool_options.metadata{'driver': {'name': 'PyMongo', 'version': '4.7.0.dev0'}, 'os': {'type': 'Darwin', 'name': 'Darwin', 'architecture': 'arm64', 'version': '14.3'}, 'platform': 'CPython 3.11.6.final.0'}
Para converter um objeto dict
de camada única em um objeto SON
, passe o objeto dict
para o construtor SON
, conforme mostrado no exemplo a seguir:
data_as_dict = client.options.pool_options.metadata SON(data_as_dict)SON([('driver', {'name': 'PyMongo', 'version': '4.7.0.dev0'}), ('os', {'type': 'Darwin', 'name': 'Darwin', 'architecture': 'arm64', 'version': '14.3'}), ('platform', 'CPython 3.11.6.final.0')])
Se o objeto dict
tiver múltiplas camadas, você deverá converter os valores um de cada vez, como mostrado no seguinte exemplo:
def dict_to_SON(data_as_dict: dict[Any, Any]): data_as_SON = SON()for key, value in data_as_dict.items(): if isinstance(value, dict) else value data_as_SON[key] = dict_to_SON(value) return data_as_SON >>> dict_to_SON(data_as_dict)SON([('driver', SON([('name', 'PyMongo'), ('version', '4.7.0.dev0')])), ('os', SON([('type', 'Darwin'), ('name', 'Darwin'), ('architecture', 'arm64'), ('version', '14.3')])), ('platform', 'CPython 3.11.6.final.0')])
Alterações significativas na versão 4.2
Para melhorar o suporte para o Pyright ferramenta, a
ClientSession
classe não usa mais digitação genérica.pymongocrypt v1.3.0 ou posterior é necessário para CSFLE (Criptografia de Nível de Campo do Lado do Cliente).
Os pacotes BSON, PyMongo e Gridfs agora usam a variável
__all__
para declarar suas APIs públicas. Se seu aplicativo contiver uma declaraçãofrom bson import *
, verifique se ela ainda importa as APIs necessárias.O método
estimated_document_count()
sempre utiliza o comando de contagem. Este comando não está disponível na Stable API nas versões 5.0.0 do MongoDB a 5.0.8. Se você usar o métodoestimated_document_count()
com a Stable API, deverá atualizar para o MongoDB Server v5.0.9 ou posterior, ou definir a opçãopymongo.server_api.ServerApi.strict
comoFalse
.