PyMongo のバージョンをアップグレードする
Overview
このページでは、PyMongo の新しいバージョンにアップグレードするときにアプリケーションに加える必要がある変更について説明します。
重要
このガイドには、v 4.0 以降のPyMongoバージョンのみに対する重大な変更が含まれています。PyMongo v2 または v3 からアップグレードする場合は、 PyMongo4 移行ガイド を参照してください。
アップグレードする前に、次のアクションを実行してください。
新しい PyMongo バージョンが、アプリケーションが接続する MongoDB Server のバージョン および アプリケーションを実行する Python バージョンと互換性があることを確認します。 バージョンの互換性情報については、 PyMongo 互換性ページを参照してください。
アプリケーションが使用しているドライバー バージョンとアップグレード予定のバージョンとの間の重大な変更については、重大な変更セクションを参照してください。
Tip
将来ドライバーのバージョンをアップグレードする際にアプリケーションに必要な変更数を最小限に抑えるには、 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 を v 4.0から v 4.7にアップグレードする場合は、バージョン4.1から4.7にリストされているすべての重大な変更に対処します。
バージョン4.9 重大な変更
バージョン 4.8 重大な変更
PyMongo v 4.8のため バックエンド ビルド システムとして
hatch
を使用している場合、setup.py
ファイルを使用してドライバーをビルドすることはできなくなりました。 代わりに、 pip を使用して PyMongo をインストールする必要があります。 編集可能なインストールの場合は、 pip v 21.3以降を使用する必要があります。
バージョン 4.7 の重大な変更
すべての内部クラスとコマンドでの
SON
コレクション タイプのすべての発生がdict
に変更されました。options.pool_options.metadata
プロパティは、SON
dict
のタイプになりました。 次のコード例は、これらの形式でのデータ保存方法の違いを示しています。
# 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'}
単一レイヤーの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
オブジェクトに複数のレイヤーがある場合は、次の例に示すように、値を一度に 1 つずつ変換する必要があります。
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')])
バージョン 4.2 の重大な変更
Python のサポートを改善するには ツールを使用すると、
ClientSession
クラスはジェネリック型を使用しなくなりました。クライアント側フィールドレベル暗号化(CSFLE)には、pymongocrypt v 1.3.0以降が必要です。
BSON 、 PyMongo 、 Grifs パッケージでは、公開 API を宣言するために
__all__
変数が使用されるようになりました。 アプリケーションにfrom bson import *
ステートメントが含まれている場合は、必要な API が引き続きインポートされていることを確認してください。estimated_document_count()
メソッドは常に count コマンドを使用します。 このコマンドは MongoDB バージョン5.0.0の Stable API では使用できません。 から5.0.8まで。 Stable API でestimated_document_count()
メソッドを使用する場合は、 MongoDB Server v 5.0にアップグレードする 必要があります。 9以降の または 、pymongo.server_api.ServerApi.strict
オプションをFalse
に設定します。