Docs Menu

Docs Home애플리케이션 개발Python 드라이버PyMongo

PyMongo 버전 업그레이드

이 페이지의 내용

  • 개요
  • 사용 중단 경고 표시
  • 호환성이 손상되는 변경

이 페이지에서는 새 버전의 PyMongo로 업그레이드할 때 애플리케이션을 변경해야 하는 경우에 대해 설명합니다.

중요

이 가이드에는 v4.0 이후의 PyMongo 버전에 대한 호환성이 손상되는 변경만 포함되어 있습니다. PyMongo v2 또는 v 에서 업그레이드하는3 경우 PyMongo 4 마이그레이션 가이드를 참조하세요.

업그레이드하기 전에 다음 작업을 수행하세요:

  • 새 PyMongo 버전이 애플리케이션 이 연결되는 MongoDB Server 버전 및 애플리케이션 이 실행되는 Python 버전과 호환되는지 확인합니다. 버전 호환성 정보는 PyMongo 호환성 페이지를 참조하세요.

  • 호환성이 손상되는 변경 섹션에서 애플리케이션에서 사용 중인 드라이버 버전과 업그레이드 예정 버전 간의 호환성이 손상되는 변경을 해결하세요.

향후 운전자 버전을 업그레이드할 때 애플리케이션 에 필요한 변경 사항의 수를 최소화하려면 Stable API 를 사용합니다.

더 이상 사용되지 않는 PyMongo 기능을 사용하는 경우 드라이버는 DeprecationWarning 을(를) 발생시킵니다. 기본적으로 Python 인터프리터는 이러한 경고를 무음으로 설정합니다. stderr 에 출력하려면 -Wd 옵션으로 Python을 시작합니다.

다음 예제에서는 더 이상 사용되지 않는 메서드를 호출하는 Python 애플리케이션인 insert.py 를 실행합니다. Python이 -Wd 옵션으로 시작되었기 때문에 인터프리터에 DeprecationWarning 가 표시됩니다.

$ python3 -Wd insert.py
insert.py:4: DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.
client.test.test.insert({})

DeprecationWarning 메시지를 예외로 처리하려면 다음 예와 같이 대신 -We 옵션을 사용하여 Python을 시작합니다.

$ 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.

인터프리터 경고 및 -W 옵션에 대한 자세한 내용은 다음 Python 설명서를 참조하세요.

호환성이 손상되는 변경은 드라이버의 특정 버전에서 시작되는 규칙 또는 동작의 변경입니다. 이러한 유형의 변경으로 인해 드라이버를 업그레이드하기 전에 해결하지 않으면 애플리케이션이 제대로 작동하지 않을 수 있습니다.

이 섹션의 호환성이 손상되는 변경은 이를 도입한 드라이버 버전별로 분류됩니다. 드라이버 버전을 업그레이드할 때 현재 버전과 업그레이드 버전 간의 호환성이 손상되는 변경을 모두 해소합니다.

예시

버전 4.0에서 업그레이드

PyMongo를 v4.0 에서 v4.7 로 업그레이드하는 경우 4.1 ~ 4.7 버전에 대해 나열된 모든 호환성이 손상되는 변경(있는 경우)을 해결합니다.

  • 모든 내부 클래스 및 명령에 대한 SON 컬렉션 유형의 모든 항목이 dict 로 변경되었습니다.

  • options.pool_options.metadata 속성은 이제 SON dict 유형입니다. 다음 코드 예시는 이러한 형식이 데이터를 저장하는 방식의 차이점을 보여줍니다.

# Before (SON)
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> client.options.pool_options.metadata
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')])
# 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'}

단일 계층 dict 객체를 SON 객체로 변환하려면 다음 예제와 같이 dict 객체를 SON 생성자에 전달합니다.

>>> 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')])

dict 객체에 여러 레이어가 있는 경우 다음 예제와 같이 값을 한 번에 하나씩 변환해야 합니다.

>>> def dict_to_SON(data_as_dict: dict[Any, Any]):
... data_as_SON = SON()
... for key, value in data_as_dict.items():
... data_as_SON[key] = dict_to_SON(value) if isinstance(value, dict) else 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')])
  • Pyright 에 대한 지원을 개선하려면 도구부터 ClientSession 클래스는 더 이상 일반 입력을 사용하지 않습니다.

  • 클라이언트 측 필드 레벨 암호화(CSFLE)에는 pymongocrypt v1.3.0 이상이 필요합니다.

  • BSON, PyMongo 및 gridfs 패키지는 이제 __all__ 변수를 사용하여 공개 API를 선언합니다. 애플리케이션에 from bson import * 문이 포함된 경우 여전히 필요한 API를 가져오는지 확인합니다.

  • estimated_document_count() 메서드는 항상 count 명령을 사용합니다. 이 명령은 MongoDB 버전 5.0.0 의 Stable API에서 사용할 수 없습니다. 통해 5.0.8. Stable API와 함께 estimated_document_count() 메서드를 사용하는 경우 MongoDB Server v5.0 로 업그레이드해야 합니다.9 이상이거나 pymongo.server_api.ServerApi.strict 옵션을 False 로 설정합니다.

← 새로운 기능