本文介绍了pymongo编写时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法对远程mongodb数据库进行任何写操作.我可以连接并进行查找(例如查找).我这样连接:

I am unable to do any writes to a remote mongodb database. I am able to connect and do lookups (e.g. find). I connect like this:

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

但是当我尝试插入时,

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

我遇到错误:

---------------------------------------------------------------------------
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

如果我删除了slaveOK=True(将其设置为默认值False),那么我仍然可以连接,但是读取(和写入)失败:

If I remove the slaveOK=True (setting it to it's default value of False) then I can still connect, but the reads (and writes) fail:

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 connecting to the primary replica?

推荐答案

AutoReconnect: not master表示您的操作失败,因为您要在其上发出命令的节点不是副本集的主节点,而该命令(例如,写操作)要求该节点为主要节点.设置slaveOK=True仅使您能够从辅助节点读取,默认情况下,您只能从主节点读取.

AutoReconnect: not master means that your operation is failing because the node on which you are attempting to issue the command is not the primary of a replica set, where the command (e.g., a write operation) requires that node to be a primary. Setting slaveOK=True just enables you to read from a secondary node, where by default you would only be able to read from the primary.

MongoClient可以自动发现并连接到主数据库.请参见连接到副本集. /api.mongodb.org/python/current/index.html">PyMongo文档.

MongoClient is automatically able to discover and connect to the primary if the replica set name is provided to the constructor with replicaSet=<replica set name>. See "Connecting to a Replica Set" in the PyMongo docs.

顺便说一句,slaveOK已被弃用,取而代之的是 ReadPreference .如果要定位主节点以外的其他节点,则可以在创建客户端或发出查询时指定ReadPreference.

As an aside, slaveOK is deprecated, replaced by ReadPreference. You can specify a ReadPreference when creating the client or when issuing queries, if you want to target a node other than the primary.

这篇关于pymongo编写时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 23:56