Pymongo error while writing

I can not write to the remote mongodb database. I can connect and search (e.g. find). I connect as follows:

conn = pymongo.MongoClient(db_uri,slaveOK=True) db = conn.test_database coll = db.test_collection 

But when I try to paste,

 coll.insert({'a':1}) 

I encountered an error:

 --------------------------------------------------------------------------- AutoReconnect Traceback (most recent call last) <ipython-input-56-d4ffb9e3fa79> in <module>() ----> 1 coll.insert({'a':1}) /usr/lib/python2.7/dist-packages/pymongo/collection.pyc in insert(self, doc_or_docs, manipulate, safe, check_keys, continue_on_error, **kwargs) 410 message._do_batched_insert(self.__full_name, gen(), check_keys, 411 safe, options, continue_on_error, --> 412 self.uuid_subtype, client) 413 414 if return_one: /usr/lib/python2.7/dist-packages/pymongo/mongo_client.pyc in _send_message(self, message, with_last_error, command, check_primary) 1126 except (ConnectionFailure, socket.error), e: 1127 self.disconnect() -> 1128 raise AutoReconnect(str(e)) 1129 except: 1130 sock_info.close() AutoReconnect: not master 

If I remove slaveOK=True (setting the default value to False), then I can still connect, but reading (and writing) fails:

 AutoReconnect Traceback (most recent call last) <ipython-input-70-6671eea24f80> in <module>() ----> 1 coll.find_one() /usr/lib/python2.7/dist-packages/pymongo/collection.pyc in find_one(self, spec_or_id, *args, **kwargs) 719 *args, **kwargs).max_time_ms(max_time_ms) 720 --> 721 for result in cursor.limit(-1): 722 return result 723 return None /usr/lib/python2.7/dist-packages/pymongo/cursor.pyc in next(self) 1036 raise StopIteration 1037 db = self.__collection.database -> 1038 if len(self.__data) or self._refresh(): 1039 if self.__manipulate: 1040 return db._fix_outgoing(self.__data.popleft(), /usr/lib/python2.7/dist-packages/pymongo/cursor.pyc in _refresh(self) 980 self.__skip, ntoreturn, 981 self.__query_spec(), self.__fields, --> 982 self.__uuid_subtype)) 983 if not self.__id: 984 self.__killed = True /usr/lib/python2.7/dist-packages/pymongo/cursor.pyc in __send_message(self, message) 923 self.__tz_aware, 924 self.__uuid_subtype, --> 925 self.__compile_re) 926 except CursorNotFound: 927 self.__killed = True /usr/lib/python2.7/dist-packages/pymongo/helpers.pyc in _unpack_response(response, cursor_id, as_class, tz_aware, uuid_subtype, compile_re) 99 error_object = bson.BSON(response[20:]).decode() 100 if error_object["$err"].startswith("not master"): --> 101 raise AutoReconnect(error_object["$err"]) 102 elif error_object.get("code") == 50: 103 raise ExecutionTimeout(error_object.get("$err"), AutoReconnect: not master and slaveOk=false 

Am I connecting incorrectly? Is there a way to specify a connection to the primary replica?

+5
source share
1 answer

AutoReconnect: not master means that your operation fails because the node in which you are trying to execute the command is not the main part of the replica set where the command (for example, for the write operation) requires node to be primary. Setting slaveOK=True allows you to read only from the secondary node, where by default you can only read from the primary.

MongoClient can automatically detect and connect to the primary if the replicaSet=<replica set name> provided to the constructor with replicaSet=<replica set name> . See “ Connecting to a Replica Set ” in PyMongo docs .

Aside, slaveOK deprecated, replaced by ReadPreference . You can specify ReadPreference when creating a client or when issuing requests if you want to target the node different from the main one.

+11
source

Source: https://habr.com/ru/post/1202646/


All Articles