2013-03-07 3 views
0

я был использован, чтобы сделать это в PyMongo как средство доступа к конкретной базе данных:Установите базу данных mongo в pymongo без eval(). Может быть, setattr()?

import pymongo 

connection = pymongo.MongoClient() 
db = connection.DBNAME 

затем db.collectioname.find-опрос() и т.д. Тем не менее, теперь я хочу, чтобы иметь возможность подключения к базам данных, именуемым через переменную, с глазу на цикл по ряду баз данных. Так что-то вроде:

dbname = 'DBNAME' 

connection = pymongo.MongoClient() 
db = eval('connection.' + dbname) 

Я учил, что Eval() является иногда дьявол и его следует избегать. Как я могу сделать это с помощью setattr() или другого решения? Что-то вроде ...

dbname = 'DBNAME' 

connection = pymongo.MongoClient() 
db = setattr(connection, '??name??', dbname) 

ответ

5

Вы хотите getattr, не setattr.

db = getattr(connection,dbname) 

где setattr способ установить атрибут, если вы знаете, что это имя, getattr способ получить атрибут, если вы знаете, что это имя.

Другими словами, следующие 100% эквивалентны:

db = connection.DBNAME 
db = getattr(connection,'DBNAME') 
+0

Да, спасибо, это очень полезно. Я не был уверен, что знаю, что имя базы данных было надлежащим атрибутом. Когда я набрал 'dir (connection)', я этого не видел! – Mittenchops