Reputation: 1029
Premise: Search public comments (a string) for instances of items from a predetermined list. There can be multiple list matches within a single comment.
I am trying to use a Many to Many structure to keep track of this.
I have created the following database structure using 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')
And using the following to find matches
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()
Problem: Looking at the comment in the above snippet, I don't understand how I add the relationship of potentially multiple character matches from the comment['comment_body'] string into the reddit_assoc assocation table correctly. Can someone please advise further?
Upvotes: 0
Views: 434
Reputation: 1068
Relationships that you are using in this case behave as a list. So you need to add newly created reddit comment to list 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()
Upvotes: 1