下面的代碼連接到 MongoDB,然后嘗試查找存在的指定記錄。收藏品非常少。
client = pymongo.MongoClient("PRIVATE_MONGO_ACCESS_HERE?retryWrites=true&w=majority")
db = client.my_db
score_holder = db['app_data'].find_one({'score_holder': True})
結果:pymongo.errors.ServerSelectionTimeoutError
我很確定上面的代碼在幾周前運行良好——從那以后沒有任何代碼發生變化,我不記得升級過任何東西。我在 MongoDB 上沒有看到任何關于此更改的內容,也沒有其他人遇到此問題。
我可以用這個替換最后一行:
score_holder = db['app_data'].find({'score_holder': True})
我得到一個結果:<pymongo.cursor.Cursor object>
這意味著我們可以確定我正在連接到資料庫,我有能力檢索記錄,并且該特定記錄確實存在。
我也嘗試不帶引數地查找,因為為什么不:
score_holder = db['app_data'].find_one()
結果:pymongo.errors.ServerSelectionTimeoutError
為什么我會用一種方法而不是另一種方法超時?
uj5u.com熱心網友回復:
這意味著我們可以確定我正在連接到資料庫
我懷疑這種說法是不正確的,這導致關于整體問題的結論同樣不正確。
我相信這里發生的是find_one()呼叫立即執行,但find()不是。呼叫回傳了一個 (PyMongo) 游標物件,find()但代碼本身尚未真正與資料庫通信。嘗試從游標讀取,看看會發生什么,請參閱下面的演示,其中沒有在提供的地址運行資料庫:
>>> client = pymongo.MongoClient('172.17.0.2')
>>> db = client.test
>>> score_holder = db['foo'].find()
>>> print(score_holder)
<pymongo.cursor.Cursor object at 0x7fb7b876d220>
>>> for doc in score_holder:
... print(doc)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/cursor.py", line 1248, in next
if len(self.__data) or self._refresh():
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/cursor.py", line 1139, in _refresh
self.__session = self.__collection.database.client._ensure_session()
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1712, in _ensure_session
return self.__start_session(True, causal_consistency=False)
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1657, in __start_session
self._topology._check_implicit_session_support()
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/topology.py", line 538, in _check_implicit_session_support
self._check_session_support()
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/topology.py", line 554, in _check_session_support
self._select_servers_loop(
File "/home/charris/.local/lib/python3.8/site-packages/pymongo/topology.py", line 238, in _select_servers_loop
raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: 172.17.0.2:27017: [Errno 113] No route to host, Timeout: 30s, Topology Description: <TopologyDescription id: 6363dddd5a1caf7896d4cc13, topology_type: Unknown, servers: [<ServerDescription ('172.17.0.2', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('172.17.0.2:27017: [Errno 113] No route to host')>]>
>>>
您當前問題的答案是兩者都在執行find_one()時find()超時。因此,您應該回傳并完全檢查運行此代碼的客戶端與資料庫本身之間的連接性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527090.html
標籤:Pythonmongodbmongodb查询pymongo
