努力想出 SQLAlchemy 模型关系
Posted
技术标签:
【中文标题】努力想出 SQLAlchemy 模型关系【英文标题】:Struggling to come up with SQLAlchemy model relation 【发布时间】:2021-02-07 19:31:00 【问题描述】:这里是 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
表中,带有时间戳和文本内容,并在此表中附加新标题,我'想指定它是从哪个站点收集的,所以这个标题 id 被添加到站点特定的表中。
我曾经将数据存储在特定于站点的表中,但我认为这是完全错误的解决方案 - 例如表 Times
与列 id
、headline
、time_stamp
和其他站点的表具有完全相同的结构,但为此创建 SQLAlchemy 模型可能会否定 DRY 的一切。
【问题讨论】:
为什么不在标题表中加入“出版物”列来区分标题的来源? 哈哈!哦,snap,你是对的,这只是我以我以前的解决方案设计方式思考的一个例子。你是 100% 正确的,谢谢! 【参考方案1】:我认为您可以尝试一种不同的方法,您可以为所有新闻来源设置一个表格(例如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
的关系。请参阅 one to many relationships 和 backref 上的 sqlalchemy 文档。
【讨论】:
谢谢。我认为这是我的目标。 (显然我在重写代码时犯了错误,嗯!)我想现在我会选择@Blue Star 解决方案,因为它可能是这种情况下最简单和最合适的解决方案。谢谢您的意见!非常感谢!以上是关于努力想出 SQLAlchemy 模型关系的主要内容,如果未能解决你的问题,请参考以下文章
在 Flask-SQLAlchemy 模型上使用函数查询会给出 BaseQuery object is not callable 错误