SQL新手,听我说。
我试图从不同的新闻网站的标题存储数据。试图找出正确的数据库结构和SQLAlchemy模型,但现在似乎我很难掌握如何创建适当的关系。
现在我已经结束了以下models.py
文件:
class Headline(Base):
__tablename__ = 'headlines'
id = Column(Integer, primary_key=True, index=True)
headline = Column(DateTime)
time_stamp = Column(String)
class NewYorkTimes(Base):
__tablename__ = 'newyorktimes'
id = Column(Integer, primary_key=True)
headline_id = Column(ForeignKey(Headline.id))
headlines = relationship(
'Headline',
primaryjoin="and_(NewYorkTimes.headline_id==Headline.id)"
)
class Times(Base):
__tablename__ = 'times'
id = Column(Integer, primary_key=True)
headline_id = Column(ForeignKey(Headline.id))
headlines = relationship(
'Headline',
primaryjoin="and_(Times.headline_id==Headline.id)"
)
我真的不确定这种关系是否正确…我希望将所有标题存储在headlines
表中,带有时间戳和文本内容,并且在添加新标题的同时,我想指定它是从哪个站点收集的,因此将this标题id添加到站点特定的表中。
我曾经将数据存储在特定于站点的表中,但我认为这只是一个完全错误的解决方案-例如,表Times
与列id
,headline
,time_stamp
和其他站点的表具有完全相同的结构,但是为此创建SQLAlchemy模型可能否认了DRY的所有内容。
我认为您可以尝试一种不同的方法,其中您有一个表(Publications
)为您的所有新闻来源,而不是每个来源一个单独的表。在这种方法中,Times
,NewYorkTimes
和其他任何您拥有的都将是Publications
表中的条目。
还有,你似乎把上面标题和时间戳列的列类型搞混了。
class Headline(Base):
__tablename__ = 'headlines'
id = Column(Integer, primary_key=True, index=True)
headline = Column(String)
time_stamp = Column(Datetime)
publication_id = Column(Integer, ForeignKey('publications.id'))
class Publication(Base):
__tablename__ = 'publications'
id = Column(Integer, primary_key=True)
name = Column(String)
headlines = relationship('Headline', backref="publication")
在headlines
表上使用backref
将自动在Headline
表上添加一个名为publication
的关系。参见sqlalchemy文档中的一对多关系和backref。