Docs Menu

Docs Homeアプリケーションの開発Python ドライバーPyMongo

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.

Tip

インタープリタ警告と-Wオプションの詳細については、次の Python ドキュメントを参照してください。

重大な変更とは、ドライバーの特定のバージョン以降の規則または動作の変更です。 このタイプの変更では、ドライバーをアップグレードする前に対処しないと、アプリケーションが正常に動作しなくなる可能性があります。

このセクションの重大な変更は、それを導入したドライバーのバージョンによって分類されます。 ドライバーのバージョンをアップグレードするときは、現在のバージョンとアップグレードのバージョン間のすべての重大な変更に対処してください。

バージョン4.0からのアップグレード

PyMongo を v 4.0から v 4.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オブジェクトに複数のレイヤーがある場合は、次の例に示すように、値を一度に 1 つずつ変換する必要があります。

>>> 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')])
  • 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に設定します。

← 新機能