2017-10-08 13 views
0

Lieu: Rechercher des commentaires publics (une chaîne) pour des instances d'éléments d'une liste prédéterminée. Il peut y avoir plusieurs correspondances de liste dans un seul commentaire.Ajout à une relation Many to Many avec SQLAlchemy

J'essaye d'employer un beaucoup à beaucoup structure pour garder la trace de ceci.

J'ai créé la structure de base de données suivante à l'aide SQLAlchemy (Python 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') 

Et en utilisant les éléments suivants pour trouver des correspondances

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() 

Problème: En regardant le commentaire dans la au-dessus de l'extrait, je ne comprends pas comment j'ajoute la relation de potentiellement plusieurs caractères correspond de la comm ent ['comment_body'] chaîne dans le reddit_assoc table d'assocation correctement. Quelqu'un peut-il s'il vous plaît conseiller plus loin?

Répondre

1

Les relations que vous utilisez dans ce cas se comportent comme une liste. Vous devez donc ajouter le commentaire Reddit nouvellement créé à la liste 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

S'il vous plaît noter que 'Session.merge()' retourne l'instance issue de la fusion comme une nouvelle instance, donc 'rc' n'est pas réellement ajouté à la session jusqu'à ce que' reader.reddit_mentions.append (rc) 'est appelée, et 2 lignes seront insérées au lieu d'une, si "information pertinente du commentaire" ne contient pas de clé primaire. Cela ne se produira pas d'autre part, car le code augmentera 'TypeError' à' Session.flush (rc) ', puisque' flush() 'attend une itération des objets d'instance. Enfin, 'lecteur' est une liste d'occurrences' characters', donc 'Session.add (reader)' sera également généré. –

+0

Et bien sûr 'reader.reddit_mentions.append (rc)' serait également déclenché, car 'list' n'a pas d'attribut reddit_mentions. –

+0

@ IljaEverilä yap, mon erreur, le changement de code – PerunSS