2017-10-08 2 views
0

전제 : 미리 정의 된 목록의 항목 인스턴스에 대한 공용 주석 (문자열)을 검색합니다. 하나의 댓글 내에 여러 개의 일치하는 목록이있을 수 있습니다.SQLAlchemy와의 다 대다 관계에 추가

많은 것을 구조를 추적하기 위해 많은 것으로 사용하려고합니다. 에서 주석을 보면 :

나는 SQLAlchemy의 (파이썬 3.5)

reddit_assoc = Table('reddit_assoc', Base.metadata, 
    Column('comment_id', Integer, ForeignKey('reddit_comments.comment_id')), 
    Column('character_id', Integer, ForeignKey('characters.character_id')) 
    ) 

class characters(Base): 
    __tablename__ ='characters' 

    character_id = Column(VARCHAR(20),primary_key=True) 
    name = Column(VARCHAR(3072)) 
    added = Column('added', DateTime, default=datetime.datetime.now()) 
    reddit_mentions = relationship('reddit_comments', secondary='reddit_assoc', back_populates='character_mentions') 

class reddit_comments(Base): 
    __tablename__ = 'reddit_comments' 
    comment_id = Column(VARCHAR(50), primary_key=True) 
    comment_author = Column(VARCHAR(300)) 
    comment_created = Column(VARCHAR(300)) 
    link_id = Column(VARCHAR(50)) 
    subreddit_id = Column(VARCHAR(50)) 
    character_mentions = relationship('characters', secondary='reddit_assoc', back_populates='reddit_comments') 

를 사용하여 일치

def char_counter(comment): 
    Session = DBSession() 
    reader = Session.query(characters).all() 

    for char in reader: 
     if char[0] in comment['comment_body'] or char[1] in comment['comment_body']: 
      # We have a match. Add to database. 
      Session.merge(reddit_comments(#relevant information from comment#)) 
      #How do I add to the Many to Many here? 
      Session.commit() 
     Session.close() 

문제

를 찾으려면 다음을 사용하여 다음과 같은 데이터베이스 구조를 만들었습니다 위의 발췌 문장에서 나는 잠재적으로 관계를 추가하는 방법을 이해하지 못한다 복수 문자는과 일치한다. ent [ 'comment_body'] 문자열을 reddit_assoc 어세 오션 테이블에 올바르게 입력하십시오. 누군가가 더 조언을 해주실 수 있습니까?

답변

1

이 경우 사용중인 관계는 목록으로 작동합니다. 따라서 새로 작성한 reddit 주석을 reddit_mentions에 추가해야합니다.

def char_counter(comment): 
    Session = DBSession() 
    reader = Session.query(characters).all() 

    for char in reader: 
     if char[0] in comment['comment_body'] or char[1] in comment['comment_body']: 
      # We have a match. Add to database. 
      rc = reddit_comments(#relevant information from comment#) 
      Session.flush() # to ensure you have primary key, although may not be needed 
      char.reddit_mentions.append(rc) # this will eventually fill your reddit_assoc table 
      Session.add(char) 

    # move this outside of loop   
    Session.commit() 
    Session.close() 
+0

'reader.reddit_mentions.append (RC)'호출 될 때까지 rc' 실제로 세션에 추가되지 않은'그래서'들어 Session.merge()가'새로운 인스턴스로 병합 된 인스턴스를 반환 있습니다, "주석의 관련 정보"에 기본 키가 포함되어 있지 않으면 2 행이 하나 대신 삽입됩니다. 'flush()'는 인스턴스 객체의 반복 가능을 기대하기 때문에 코드는'Session.flush (rc)'에서'TypeError'를 발생 시키므로 다른 일은 일어나지 않을 것입니다. 마지막으로 'reader'는'characters' 인스턴스의 목록이므로'Session.add (reader)'도 발생합니다. –

+0

물론 'list'에는 reddit_mentions 속성이 없으므로'reader.reddit_mentions.append (rc)'도 올릴 것입니다. –

+0

@ IljaEverilä yap, 내 실수, 코드 변경 – PerunSS

관련 문제