개요
이 페이지에서는 새 버전의 PyMongo로 업그레이드할 때 애플리케이션을 변경해야 하는 경우에 대해 설명합니다.
중요
이 가이드 에는 v4.0 이후의 PyMongo 버전에 대한 호환성이 손상되는 변경만 포함되어 있습니다. PyMongo v2 또는 v3에서 업그레이드하는 경우 PyMongo 4 마이그레이션 가이드를 참조하세요.
업그레이드하기 전에 다음 작업을 수행하세요:
새 PyMongo 버전이 애플리케이션 연결되는 MongoDB Server 버전 및 애플리케이션 실행되는 Python 버전과 호환되는지 확인합니다. 버전 호환성 정보는 호환성 페이지를 참조하세요.
호환성이 손상되는 변경 섹션에서 애플리케이션에서 사용 중인 드라이버 버전과 업그레이드 예정 버전 간의 호환성이 손상되는 변경을 해결하세요.
팁
향후 운전자 버전을 업그레이드할 때 애플리케이션 에 필요한 변경 사항의 수를 최소화하려면 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.
호환성이 손상되는 변경
호환성이 손상되는 변경은 드라이버의 특정 버전에서 시작되는 규칙 또는 동작의 변경입니다. 이러한 유형의 변경으로 인해 드라이버를 업그레이드하기 전에 해결하지 않으면 애플리케이션이 제대로 작동하지 않을 수 있습니다.
이 섹션의 호환성이 손상되는 변경은 이를 도입한 드라이버 버전별로 분류됩니다. 드라이버 버전을 업그레이드할 때 현재 버전과 업그레이드 버전 간의 호환성이 손상되는 변경을 모두 해소합니다.
예시
버전 4.0에서 업그레이드
PyMongo를 v4.0 에서 v4.7 로 업그레이드하는 경우 4.1 ~ 4.7 버전에 대해 나열된 모든 호환성이 손상되는 변경(있는 경우)을 해결합니다.
버전 4.9 호환성이 손상되는 변경
애플리케이션 에서 클라이언트 측 필드 레벨 암호화 (CSFLE)를 사용하려면 v 이상을 사용해야 합니다.
pymongocrypt1.10
버전 4.8 호환성이 손상되는 변경
왜냐하면 PyMongo v4.8
hatch를 백엔드 빌드 시스템으로 사용하는 경우, 더 이상setup.py파일 을 사용하여 운전자 를 빌드 할 수 없습니다. 대신 pip를 사용하여 PyMongo 를 설치해야 합니다. 편집 가능한 설치의 경우 pip v21.3 이상을 사용해야 합니다.
버전 4.7 호환성이 손상되는 변경
모든 내부 클래스 및 명령에 대한
SON컬렉션 유형의 모든 항목이dict로 변경되었습니다.options.pool_options.metadata속성은 이제SONdict유형입니다. 다음 코드 예시는 이러한 형식이 데이터를 저장하는 방식의 차이점을 보여줍니다.
# 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')])
버전 4.2 호환성이 손상되는 변경
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로 설정합니다.