当前位置: 首页 > 面试题库 >

如何渴望加载(可选)存在筛选关系

柯昆
2023-03-14
问题内容

我正在研究SQLAlchemy 0.9.8

此问题与“如何通过SqlAlchemy中的joinloaded表进行筛选?
”有关,但并不相同。

我有Article实体,并且可以 选择ArticleL10n实体进行本地化。

Base = declarative_base()

class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer, primary_key=True)
    title = Column(String(255))
    l10n = relationship("ArticleL10n",
            collection_class=attribute_mapped_collection('lang'),
            cascade="all, delete-orphan")

class ArticleL10n(Base):
    __tablename__ = 'article_10n'
    article_id = Column(Integer, ForeignKey('article.id'), primary_key=True)
    lang = Column(String(15), primary_key=True)
    title = Column(String(255))

我想查询特定语言的Article列表ArticleL10n

我试过了:

session.query(Article) \
    .outerjoin(Article.l10n) \
    .options(contains_eager(Article.l10n)) \ 
    .filter(ArticleL10n.lang == "en") \
    .all()

这是行不通的,因为如果文章没有"en"本地化,它将被过滤掉。

我当前的工作代码是这样的:

session.query(Article) \
    .outerjoin(ArticleL10n, and_(ArticleL10n.article_id == Article.id, ArticleL10n.lang == "en")) \
    .options(contains_eager(Article.l10n)) \ 
    .all()

这似乎有效。但是我不喜欢这样,因为ArticleL10n.article_id == Article.id部分看起来多余。我相信应该有更好的方法来做到这一点。

我该如何简化呢?


问题答案:

您可以relationship直接在第一部分中使用而不是加入条件join

.outerjoin(ArticleL10n, and_(Article.l10n, ArticleL10n.lang == "en"))


 类似资料:
  • 问题内容: SQLAlchemy支持渴望加载关系,这基本上是一条语句。但是,如果模型具有两个或多个关系,则可能是非常庞大的联接。例如, 该查询的性能实在是太差了,因为中和会产生一个巨大的表。但是和在这里没有关系,因此它们不应该是。它应该是两个分开的查询。并且由于会话具有某种程度的缓存,因此我将查询更改为此。 这次的性能要好得多。但是,我不认为这样做是正确的。我不确定会话结束时标签缓存是否会过期。

  • 我有以下三个表格: 帖子 帖子: 评论: 标签: Post表有许多注释,comments表有许多与之关联的标记。 如何使用“快速加载”将所有这些表组合在一起? 比如: 但是这个查询总是在标记关系中返回空响应。 我做错了什么? 期望的结果是这样的: 你可以看到帖子里面包含评论,评论里面也包含标签关系。 另外,我在我的项目中使用了“jenssegers/laravel mongodb”包,我试图在没有

  • 我正在使用教义2来绘制学术时间表。以下是对这些关系的简化观察: 一个类有事件(一对多) 事件具有类型(多对一) 一个事件有一个位置(多对一) 使用

  • 拉威尔说: 我需要的是这样的东西 我们可以在一个关系中加载多个关系。 这有可能吗?

  • 问题内容: 好吧,我对此完全感到困惑。我正在尝试构建按类别组织的已发布网页菜单。 Category.rb: Page.rb Page模型还具有:is_published,因此我也尝试对其进行过滤。我不愿意发布我微不足道的查询尝试,但是除了乞求更聪明的人之外,没有其他解决方案: (自己是@current_website) 这大部分返回我需要的内容,但没有返回未发布页面的父类别。例如,如果我有以下方法

  • 我有一个问题,就是基于hasMany关系从数据库中获取数据并将其发送到Larave中的api。在下面的代码中,Laravel没有给我客户id=$id的产品。我不知道为什么,我不能在$query旁边发送$id。如果我把号码写在“我有很好的安全套,但我需要自动拿。 所有api代码 先谢谢你。

  • 问题内容: 我相信只有两种使用Hibernate加载对象的方法,即延迟加载和一种渴望加载。延迟加载有其自身的优势,它不会加载很多对象,而只是在需要时才加载它们。我还了解到,如果您想强制为一个对象加载所有子代,则只需调用即可。假设我们有以下对象 假设我们有一些客户在我们的系统中有订单,并且该订单可能不止一个甚至为空。所以我的问题是,在这种情况下始终使用渴望加载会更好吗?我们需要与客户相关的订单的大小

  • 问题内容: EJB似乎是延迟加载的-每当访问时。 但是,我想热切地初始化它们-即每当容器启动时。如何实现的(特别是在JBoss中) 该主题提供了一些提示,但并不令人满意。 问题答案: 从EJB 3.1开始,可以将模块启动和停止通知单例bean: 在EJB 3.1之前,没有标准的纯EJB解决方案。我建议将WAR添加到您的EAR并使用servlet-context-listener。