skiman01
skiman01

Reputation: 170

Can't connect to MongoDB database and collection through class variables

Just as a preface, I understand that there are easier ways to accomplish much of what i'm trying to do, and the following question is for purposes of learning how to build classes and instantiate a database connection within that class.

I'm building a class that right now just takes in two variables; the name of MongoDB database, and the collection name from that database. I am trying to instantiate the connection of this database and the collection in the init function of this class. The problem I am having is that the init function is connecting to the database of the actual name of the variable instead of the variable's actual assignment. More specifically, if I instantiate,

>>>salesChar = MongoDumps("sales","char")

and then I call,

>>>salesChar.db.name

it will instead connect to the "dBase" (the name of the variable) database instead of the "salesChar" (the assignment of the dBase variable) database. Please view code below,

import pymongo
from pymongo import MongoClient

class MongoDumps():
"""Data Dumping into MongoDB"""

    def __init__(self, dBase, dumpCollection):
        self.dBase = dBase
        self.dumpCollection = dumpCollection
        client = MongoClient()
        self.db = client.dBase
        self.collection = self.db.dumpCollection

I've tried a combination of strategies and none seem to work with a similar result in each one. Are there certain limitations to using assignments in a class? Thanks for your help!

Upvotes: 1

Views: 690

Answers (1)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236248

Use getattr to get property by string. As documentation says, getattr(x, 'foobar') is equivalent to x.foobar. Your code should look like:

class MongoDumps():
    def __init__(self, dBase, dumpCollection):
        self.dBase = dBase
        self.dumpCollection = dumpCollection
        client = MongoClient()
        self.db = getattr(client, dBase)
        self.collection = getattr(self.db, dumpCollection)

Then you can use this class to get collection by name:

salesChar = MongoDumps("sales", "char")
first = salesChar.collection.find_one()

Upvotes: 1

Related Questions