web-dev-qa-db-fra.com

L'objet Collection n'est pas une erreur appelable avec PyMongo

En suivant le PyMongo tutorial et j'obtiens une erreur en appelant la méthode insert_one sur une collection.

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.

Il y a quelques articles en ligne qui traitent de cette erreur, mais tous semblent l'être lorsque l'utilisateur appelle un nom obsolète.

Des conseils sur ce que je fais mal ici?

43
Jason Strimpel

C'est une question claire, mais le problème ici semble être que vous lisez la documentation de la version "beta" mais que vous avez probablement au plus "pymongo" 2.8 installé au lieu de "3.0b". dans le lien que vous citez.

Le tutoriel de la version 2.8 pointe vers la méthode .insert() :

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

Étant donné que .insert_one() est uniquement disponible dans le pilote 3.0b.

Forcez l’installation du pilote "beta" ou utilisez un pilote stable et les méthodes disponibles.

Cela semble être la faute de la "réponse du moteur de recherche" actuelle qui correspond à la "version bêta" en tant que "actuelle".

53
Neil Lunn

Le problème est que vous suivez le didacticiel de la documentation de la version actuelle, mais que vous avez réellement installé PyMongo 2.8. 

La méthode insert_one() est nouvelle dans PyMongo 3.0 et maintenant rapportée dans PyMongo 2.9 . Il est donc clair que vous devrez installer PyMongo 2.9 ou une version plus récente pour utiliser la nouvelle fonctionnalité de l’API. 

Vous pouvez installer ou mettre à niveau votre pilote en utilisant pip like.

python -m pip install -U pymongo
16
styvane

Je faisais face au même problème aussi. Lorsque j'ai essayé de mettre à niveau ma distribution PyMongo à l'aide de la commande,

pip install -U pymongo

J'ai eu l'erreur suivante: 

erreur: impossible de créer '/usr/local/lib/python2.7/dist-packages/pymongo': autorisation refusée

Apparemment, sur ma distribution, le programme d'installation n'a pas pu créer de bibliothèque dans le dossier dist-packages en raison de privilèges de permission insuffisants. J'ai donc résolu le problème en lui accordant des autorisations d'écriture et en réinstallant le pilote PyMongo: 

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

J'espère que cela t'aides.

0
Siddharth Karnam