Thomas Hubregtsen
Thomas Hubregtsen

Reputation: 439

Check if document exists using cloudant-2.0.0b2 in IBM Bluemix and Python

I am using:

According to https://pypi.python.org/pypi/cloudant/2.0.0b2, everything broke from 0.5 to 2.0, and they are still working on the documentation as everything is Beta. Next to this, I am also new to Python and databases. Documentation can be found here: http://python-cloudant.readthedocs.io/en/latest/getting_started.html

What I am trying to do is check if a document already exists.

Things that I have tried:

   from cloudant.account import Cloudant
    import time
    import json
    # Connect to the database
    client = Cloudant(*hidden*)
    client.connect()
    # The database we work in
    db = client['myDatabase']
    # The document we work on
    doc = db['myDocument']
    print doc.exists()

But the code fails before retrieving the document. I checked the source code, and it looks like it is supposed to:

  def __getitem__(self, key):
        if key in list(self.keys()):
            return super(CouchDatabase, self).__getitem__(key)
        if key.startswith('_design/'):
            doc = DesignDocument(self, key)
        else:
            doc = Document(self, key)
        if doc.exists():
            doc.fetch()
            super(CouchDatabase, self).__setitem__(key, doc)
            return doc
        else:
            raise KeyError(key)

Source: https://pypi.python.org/pypi/cloudant/2.0.0b2

Is there a way I can check if the document exists before I retrieve it? Or should I retrieve it and catch the error? Or is there a different approach?

Upvotes: 0

Views: 1526

Answers (1)

alfinkel24
alfinkel24

Reputation: 551

The behavior you are describing is the desired behavior for the python-cloudant library database object, so if you intend to use the database object to retrieve your documents and populate your local database cache you should look to except a KeyError in the event of a non-existent document and handle accordingly. However, if are interested in capturing whether a document exists before bringing it into your local database cache then changing your code to something like:

from cloudant.account import Cloudant
from cloudant.document import Document

# Connect to the database
client = Cloudant(*hidden*)
client.connect()
# The database we work in
db = client['myDatabase']
# The document we work on
if Document(db, 'myDocument').exists():
    doc = db['myDocument']

would do the trick.

Similarly you could just do:

from cloudant.account import Cloudant
from cloudant.document import Document

# Connect to the database
client = Cloudant(*hidden*)
client.connect()
# The database we work in
db = client['myDatabase']
# The document we work on
doc = Document(db, 'myDocument')
if doc.exists():
    doc.fetch()

But this would not populate your local database cache, the db dictionary.

Upvotes: 2

Related Questions