2012-04-02 3 views
4

기본적으로 목록을 가져 와서 목록의 각 항목에 대해 트위터에 대한 검색 쿼리를 실행하는 루프를 실행하는이 작은 코드가 있습니다. 나는 목록의 각 항목이 컬렉션 이름이 원하지만 어떤 이유로 나는 db<collection_name_variable>.insert(post)>가 실제로 작동 할 수 있도록하는 방법을 알아낼 수 없습니다 :db insert 명령의 콜렉션 이름에 대한 Python/Pymongo 변수

를 내가 오류 얻을 :

TypeError: unsupported operand type(s) for +: 'Database' and 'str'

을 나는이 알고 아마 아주 기초적이지만 나는 방금 배웁니다.

from twython import Twython 
from pymongo import * 

conn = Connection('localhost') 
db = conn.nosqltweets 
twitter = Twython() 

types = ['mongodb', 'cassandra', 'couchdb'] 

for nosql in types: 
    search_results = twitter.searchTwitter(q=nosql, rpp="100") 
    for tweet in search_results["results"]: 
     from_user = tweet['from_user'].encode('utf-8') 
     text = tweet['text'] 
     created_at = tweet['created_at'] 
     id_str = tweet['id_str'] 
     post = { 'id_str': id_str, 'from_user': from_user, 'created_at': created_at } 
     insert = db + nosql + ".insert(post)" 
     insert 
+1

당신은 유형 "데이터베이스"(DB) 및 "문자열", "사용 (NoSQL에)의/CONCATENATE 개체를 추가하려고 + " 운영자. – Fenikso

+0

Fenikso 옙, 실제로 놀랍지 만 그 문제를 이해했는데 해결 방법을 이해하지 못했습니다. 코멘트 주셔서 감사합니다! –

+0

@Ajj 백틱 (')을 사용하여 인라인 코드를 조정할 필요가 없습니다. –

답변

10

교체 :

insert = db + nosql + ".insert(post)" 
insert 

로 :

db[nosql].insert(post) 
+0

죄송합니다 diliop, 내 자신의 질문에 대답을하지만 그것은 내게 무슨 짓을했는지 여기에 못하게됩니다 : 나는 getattr (db, nosql)을 사용했습니다 collection = getattr (db, nosql) collection.insert (post) –

+3

위 코드에서 누락 된 것이 없으면이 방법이 효과적입니다. db는''타입이며,'db [ 'couchdb']'에 접근하는'db.couchdb' 또는'dict' 멤버와 같은 점 표기법을 사용하여' 'insert()'를 호출합니다. – diliop

+0

당신 diliop 맞아, 분명히 내가 오늘 저녁에 다시 시도했기 때문에 내가 올바르게 게시 한 것을 시도하지 않았다. 감사!! –