Объект коллекции не является вызываемой ошибкой с PyMongo

Следуя руководству PyMongo, я получаю сообщение об ошибке при вызове метода insert_one на коллекция.

In [1]: import pymongo

In [2]: from pymongo import MongoClient

In [3]: client = MongoClient()

In [4]: db = client.new_db

In [5]: db
Out[5]: Database(MongoClient('localhost', 27017), u'new_db')

In [6]: posts = db.posts

In [7]: posts.insert_one({'a':1})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-2271c01f9a85> in <module>()
----> 1 posts.insert_one({'a':1})

C:\Anaconda\lib\site-packages\pymongo-2.8-py2.7-win32.egg\pymongo\collection.py in __call__(self, *a
rgs, **kwargs)
   1771                         "call the '%s' method on a 'Collection' object it is "
   1772                         "failing because no such method exists." %
-> 1773                         self.__name.split(".")[-1])

TypeError: 'Collection' object is not callable. If you meant to call the 'insert_one' method on a 'Collection' object it is failing because no such method exists.

В Интернете есть несколько сообщений, в которых обсуждается эта ошибка, но все они, похоже, связаны с тем, что пользователь называет устаревшее имя.

Есть какие-нибудь указания относительно того, что я здесь делаю неправильно?


person Jason Strimpel    schedule 11.03.2015    source источник
comment
Я просто хотел бы добавить, что это пример того, что здесь называется наглядным примером. Этим наблюдателям следовало бы последовать примеру.   -  person Neil Lunn    schedule 11.03.2015
comment
Это случилось и со мной. Спасибо за публикацию =).   -  person rockerBOO    schedule 21.03.2015


Ответы (3)


Это ясный вопрос, но проблема здесь, похоже, в том, что вы читаете версию «бета» документации, но, по всей вероятности, у вас установлено самое большее «pymongo» 2.8, а не «3.0b», упомянутый в цитируемой вами ссылке.

руководство по выпуску 2.8 указывает на .insert() вместо этого:

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

Поскольку .insert_one() доступен только в драйвере 3.0b .

Либо принудительно установите драйвер «бета», либо используйте стабильный драйвер и доступные методы.

Похоже, это ошибка текущего «ответа поисковой системы», соответствующего «бета-версии» как «текущему».

person Neil Lunn    schedule 11.03.2015
comment
@ strimp099 На самом деле, это не твоя вина. Почувствуйте свою боль. Это всего лишь побочный продукт изменений, внесенных в недавнюю версию MongoDB 3.0. Водители меняются, чтобы не отставать. В частности, речь идет об использовании API массовых операций с определенными методами. - person Neil Lunn; 11.03.2015
comment
Что ж, у меня есть pymongo 3.7, и я все еще получаю то же сообщение об ошибке. Использование insert вместо insert_one не помогает. - person Philipp Ludwig; 10.12.2020

Проблема в том, что вы следуете руководству из документации текущего выпуска, но на самом деле у вас установлен PyMongo 2.8.

Новый метод insert_one() в PyMongo 3.0 теперь поддерживается в PyMongo 2.9 < / а>. Итак, очевидно, что вам нужно будет установить PyMongo 2.9 или более новую версию, чтобы использовать новую функцию API.

Вы можете установить или обновить драйвер, используя pip like.

python -m pip install -U pymongo
person styvane    schedule 11.03.2015

Я тоже столкнулся с той же проблемой. Когда я попытался обновить свой дистрибутив PyMongo с помощью команды,

pip install -U pymongo

Получила следующую ошибку:

ошибка: не удалось создать '/usr/local/lib/python2.7/dist-packages/pymongo': в разрешении отказано

По-видимому, в моем дистрибутиве установщик не смог создать библиотеку в папке dist-packages из-за недостаточных прав доступа. Итак, я решил проблему, предоставив ему права на запись и переустановив драйвер PyMongo:

cd /usr/local/lib/python2.7/
sudo chmod 0777 dist-packages
pip install -U pymongo

Надеюсь это поможет.

person Siddharth Karnam    schedule 12.10.2015
comment
вы не должны изменять эти разрешения, но используйте sudo -H pip install -U pymongo или pip install --user -U pymongo - person PvdL; 19.07.2018
comment
Вам также может потребоваться запустить pip от имени администратора в Windows, если вы установили его от имени администратора. - person Allan Elder; 02.08.2018