Pythonでpymongoを用いてMongoDBAtlasに接続してみます。
今回、pymongoモジュールを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。
なお、MongoDBAtlasに接続する場合は、mongo+srvプロトコルを使用する必要があるため、
pip install pymongo[srv]
上記のコマンドでpip経由でpymongo-srvをインストールする。これがないと「dnspython module must be installed to use mongodb+srv:// URI」というエラーが発生し、接続できない。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)
■pymongoを用いてMongoDBAtlasに接続する
では、早速pymongoを用いてMongoDBAtlasに接続するスクリプトを書いていきます。
■コード
import pymongo client = pymongo.MongoClient("接続するためのコード") for name in client.list_database_names(): print(name)
importでpymongoモジュールを呼び出します。その後、clientという変数を定義し、その中でpymongo.MongoClient()を用います。括弧内には、MongoDBAtlasに接続するためのコードが必要となりますので、MongoDB Atlas Database(https://www.mongodb.com/atlas/database)にアクセスし、「Sign In(サインイン)」する必要があります。
Sign In(サインイン)後、右側メニューから「DEPLOYMENT」の「Database」を選択します。選択すると、今回はMongoDBAtlasのアカウントを作成し、無料(FREE)のデータベース「Cluster0」がすでに作成されていますので、こちらに接続するために、「Connect」ボタンをクリックします。ちなみにこのデータベースの中身には何も入っていません。
クリックすると、「Connect to Cluster0」というウインドウが表示され、「Choose a connection method(接続方法を選択してください)」と書かれていますので、「Connect your application(アプリケーションを接続する)」を選択します。
選択すると、「Select your driver and version(ドライバーとバージョンを選択してください)」と書かれていますので、DRIVERを「Python」に選択し、VERSIONをお使いのVERSIONに選択します。
選択後、「Add your connection string into your application code(接続文字列をアプリケーションコードに追加します)」と書かれた箇所にコードが発行されますので、コードを編集し、コピーして、スクリプトのpymongo.MongoClient()の括弧内に貼り付けます。なお、「mongodb+srv://admin:<password>@cluster0.cywla.mongodb.net/myFirstDatabase?retryWrites=true&w=majority」となっており、「<>」の部分は削除し、MongoDB Atlas Database(https://www.mongodb.com/atlas/database)サインイン後の右側メニューの「SECURITY」の「Database Access」の「Database Users」の接続権限があるUserの「Password」を入力します。
C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\cryptography\x509\base.py:531: CryptographyDeprecationWarning: Parsed a negative serial number, which is disallowed by RFC 5280. return rust_x509.load_pem_x509_certificate(data) Traceback (most recent call last): File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 1278, in _get_socket sock_info = self.sockets.popleft() IndexError: pop from an empty deque During handling of the above exception, another exception occurred: Traceback (most recent call last): File "py_m_db.py", line 3, in <module> for name in client.list_database_names(): File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\mongo_client.py", line 1918, in list_database_names for doc in self.list_databases(session, nameOnly=True)] File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\mongo_client.py", line 1899, in list_databases res = admin._retryable_read_command(cmd, session=session) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\database.py", line 755, in _retryable_read_command return self.__client._retryable_read( File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\mongo_client.py", line 1464, in _retryable_read with self._slaveok_for_server(read_pref, server, session, File "C:\Program Files\Python38\lib\contextlib.py", line 113, in __enter__ return next(self.gen) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\mongo_client.py", line 1309, in _slaveok_for_server with self._get_socket(server, session, exhaust=exhaust) as sock_info: File "C:\Program Files\Python38\lib\contextlib.py", line 113, in __enter__ return next(self.gen) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\mongo_client.py", line 1246, in _get_socket with server.get_socket( File "C:\Program Files\Python38\lib\contextlib.py", line 113, in __enter__ return next(self.gen) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 1231, in get_socket sock_info = self._get_socket(all_credentials) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 1281, in _get_socket sock_info = self.connect(all_credentials) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 1197, in connect sock_info.check_auth(all_credentials) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 793, in check_auth self.authenticate(credentials) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 810, in authenticate auth.authenticate(credentials, self) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\auth.py", line 673, in authenticate auth_func(credentials, sock_info) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\auth.py", line 591, in _authenticate_default return _authenticate_scram(credentials, sock_info, 'SCRAM-SHA-1') File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\auth.py", line 333, in _authenticate_scram res = sock_info.command(source, cmd) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\pool.py", line 683, in command return command(self, dbname, spec, slave_ok, File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\network.py", line 159, in command helpers._check_command_response( File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\pymongo\helpers.py", line 164, in _check_command_response raise OperationFailure(errmsg, code, response, max_wire_version) pymongo.errors.OperationFailure: bad auth : Authentication failed., full error: {'ok': 0, 'errmsg': 'bad auth : Authentication failed.', 'code': 8000, 'codeName': 'AtlasError'}
Passwordに「<>」をつけたままだと、上記のエラーが発生し、接続できません。
貼り付けた後、for文を用いて、データベースに接続した後にlist_database_names()を用いてlistでデータベース名を取得し、取得したものをprint()で全て出力します。
■実行・検証
このスクリプトを「py_m_db.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\cryptography\x509\base.py:531: CryptographyDeprecationWarning: Parsed a negative serial number, which is disallowed by RFC 5280. return rust_x509.load_pem_x509_certificate(data) admin local
実行してみると、上記のように、データベースへの接続が行われて中の情報を出力させることができました。
コメント