Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>So, syntax wise you have a number of problems. It looks like you're mixing a couple of tutorials in different ways. So, firstly I'll explain what is going on with your code and explain why you're seeing what you're seeing:</p> <pre><code>import pymongo class mongoDB(): # you don't need ()'s here - only if you are inheriting classes # you could inherit from object here, which is a good practice # by doing class mongoDb(object):, otherwise you can just take # them out conn = object # here, you're defining a class member - global for all instances # generally, you don't instantiate an object pointer like this, # you would set it to None instead. It won't fail doing this, # but it's not "right" def __init__(self): # the __init__ method is the constructor method - this will # allow you to initialize a particular instance of your class, represented # by the self argument. This method is called when you call the class, i.e. # inst = mongoDb() # in this case, the conn variable is not a global. Globals are defined # at the root module level - so in this example, only pymongo is a global # conn is a class member, and would be accessed by doing mongoDB.conn global conn # with that being said, you're initializing a local variable here called conn # that is not being stored anywhere - when this method finishes, this variable # will be cleaned up from memory, what you are thinking you're doing here # should be written as mongoDB.conn = pymongo.Connection("localhost", 27017) conn = pymongo.Connection("localhost",27017) def CreateCollection(name =""): # there is one of two things you are trying to do here - 1, access a class # level member called conn, or 2, access an instance member called conn # depending on what you are going for, there are a couple of different ways # to address it. # all methods for a class, by default, are instance methods - and all of them # need to take self as the first argument. An instance method of a class # will always be called with the instance first. Your error is caused because # you should declare the method as: # def CreateCollection(self, name = ""): # The alternative, is to define this method as a static method of the class - # which does not take an instance but applies to all instances of the class # to do that, you would add a @staticmethod decorator before the method. # either way, you're attempting to access the global variable "conn" here, # which again does not exist # the second problem with this, is that you are trying to take your variable # argument (name) and use it as a property. What python is doing here, is # looking for a member variable called name from the conn object. What you # are really trying to do is create a collection on the connection with the # inputed name # the pymongo class provides access to your collections via this method as a # convenience around the method, create_collection. In the case where you # are using a variable to create the collection, you would call this by doing # conn.create_collection(name) # but again, that assumes conn is what you think it is, which it isn't dbCollection = conn.name return dbCollection if __name__ == '__main__': # here you are just creating a pointer to your class, not instantiating it # you are looking for: # database = mongoDB() database = mongoDB # this is your error, because of the afore mentioned lack of 'self' argument collection = database.CreateCollection("Hello") </code></pre> <p>I'd say have a look through the Pep-8 (http://www.python.org/dev/peps/pep-0008/) coding style guides (very helpful) to learn about how to make your code "flow" pythonically.</p> <p>Having gone through your code to explain what is going on - this is what you are ultimately trying to do:</p> <pre><code>import pymongo class MongoDB: # Classes generally are camel-case, starting with uppercase def __init__(self, dbname): # the __init__ method is the class constructor, where you define # instance members. We'll make conn an instance member rather # than a class level member self._conn = pymongo.Connection("localhost", 27017) self._db = self._conn[dbname] # methods usually start with lowercase, and are either camel case (less desirable # by Python standards) or underscored (more desirable) # All instance methods require the 1st argument to be self (pointer to the # instance being affected) def createCollection(self, name=""): return self._db[name] if __name__ == '__main__': # you want to initialize the class database = MongoDB("Hello") collection = database.createCollection("MyTable") </code></pre> <p>Given that tho - what is the goal of writing this class wrapper? The same could be written as:</p> <pre><code>import pymongo conn = pymongo.Connection('localhost', 27017) database = conn["Hello"] collection = database["MyTable"] </code></pre> <p>If you're trying to create a larger API wrapped around the pymongo database, then I'd recommend looking into some ORM modules that have already been built. There are some out there - not 100% sure which ones are available for MongoDB, but the one I use (I am biased, I wrote it) is called ORB, and can be found at <a href="http://docs.projexsoftware.com/api/orb">http://docs.projexsoftware.com/api/orb</a></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload