In particolare, Attualmente sto cercando di verificare se una connessione a un client è valido utilizzando la seguente funzione:Come si controlla se il client per un'istanza MongoDB è valido?
def mongodb_connect(client_uri):
try:
return pymongo.MongoClient(client_uri)
except pymongo.errors.ConnectionFailure:
print "Failed to connect to server {}".format(client_uri)
Ho quindi utilizzare questa funzione come questa:
def bucket_summary(self):
client_uri = "some_client_uri"
client = mongodb_connect(client_uri)
db = client[tenant_id]
ttb = db.timebucket.count() # If I use an invalid URI it hangs here
Esiste un modo catturare e lanciare un'eccezione sull'ultima riga se viene fornito un URI non valido? Inizialmente pensavo che fosse a causa di ConnectionFailure (quindi questo potrebbe essere catturato durante la connessione) ma ho sbagliato.
Se eseguo il programma con un URI non validi, che non riesce a funzionare, l'emissione di un KeyboardInterrupt rendimenti:
File "reportjob_status.py", line 58, in <module>
tester.summarize_timebuckets()
File "reportjob_status.py", line 43, in summarize_timebuckets
ttb = db.timebucket.count() #error
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1023, in count
return self._count(cmd)
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 985, in _count
with self._socket_for_reads() as (sock_info, slave_ok):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 699, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 106, in select_servers
self._condition.wait(common.MIN_HEARTBEAT_INTERVAL)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 358, in wait
_sleep(delay)
pymongo.errors.ConnectionFailure viene generato quando l'host da client_uri non è disponibile ma se il database non esiste nell'host è stato creato, quindi è necessario verificare l'esistenza del db in precedenza. – imarban
Grazie. Come si controlla l'esistenza del db in anticipo? – Leeren
Il metodo database_names nella classe MongoClient potrebbe aiutare. – imarban