努力想出 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 与列 idheadlinetime_stamp 和其他站点的表具有完全相同的结构,但为此创建 SQLAlchemy 模型可能会否定 DRY 的一切。

【问题讨论】:

为什么不在标题表中加入“出版物”列来区分标题的来源? 哈哈!哦,snap,你是对的,这只是我以我以前的解决方案设计方式思考的一个例子。你是 100% 正确的,谢谢! 【参考方案1】:

我认为您可以尝试一种不同的方法,您可以为所有新闻来源设置一个表格(例如Publications),而不是为每个新闻来源提供一个单独的表格。在这种方法中,TimesNewYorkTimes 以及您拥有的任何其他内容都将成为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框架从入门到精通之模型数据库配置

在 Flask-SQLAlchemy 模型上使用函数查询会给出 BaseQuery object is not callable 错误

sqlalchemy:与多个表的非平凡的一对一关系

导入关系中使用的 SQLAlchemy 模型?

Flask-SQLAlchemy:用户角色模型和关系

Django 模型与多个类的关系