【问题标题】:SQL alchemy ORM bracketing And statements with OR statementsSQL alchemy ORM 括号 And 语句与 OR 语句
【发布时间】:2021-10-27 08:35:18
【问题描述】:

我想知道是否有人可以帮助我将此 SQL 查询转换为 SQL alchemy ORM。我在将 And 语句与 Or 语句括起来时遇到问题。这是我正在尝试创建的查询的更简单版本:

SELECT * FROM [dbo].[UpcomingThings] WHERE ([Id] = 'ES1234' AND [Date] = '2021-08-18' AND [Period] = 27) OR ([Id] = 'ES0197' AND [Date] = '2021-08-18' AND [Period] = 29)

请注意,在这种情况下,Id 不是唯一的,因此我必须依赖多个其他列才能使其唯一。我曾尝试在各种组合中使用 .filter 和 .filter(_or()) 但我似乎无法得到它,因此它是 WHERE(括号和条件)或(括号和条件)

编辑: 如果 sql alchemy 像这样简单,这就是我要做的假设 _or 会给我一个 OR:

session.query(models.UpcomingThings).filter(UpcomingThings.Id == 'ES1234').filter(UpcomingThings.Period == 27).filter(UpcomingThings.SettlementDate == 2021-08-18).filter(or_(UpcomingThings.Id=='ES0197')).filter(UpcomingThings.Date == 2021-08-18)).filter(UpcomingThings.Period == 29))

难道我也没有办法吗

session.query(models.UpcomingThings).filter(or_((AND STATEMENT), (AND STATEMENT))

我什至尝试在 or_ 中简单地做一个 .filter 但显然这是一个语法错误!

请有人帮助将其转换为 SQLalchemy ORM!谢谢。

【问题讨论】:

  • 到目前为止您尝试了哪些方法,哪些方法不起作用?请添加一些最小的内容并指出失败的地方!

标签: sql sqlalchemy orm flask-sqlalchemy


【解决方案1】:

我认为事后似乎很清楚,但您需要使用 and_or_ 来实现这一点。对filter() 的调用应用了隐式and_,但是当您需要外部sql OR 时它不起作用。这应该做你想要达到的目标。我尝试对其进行格式化以使其更清晰。 or_ 将与 sql OR 连接条件,and_ 将与 AND 连接条件。

在一种情况下您使用SettlementDate,另一种情况下使用Date,它们应该相同吗?我只是将其更改为SettlementDate 以尝试架构。

Python 示例


#...
from sqlalchemy.sql import or_, and_
from datetime import date

class UpcomingThings(Base):
   __tablename__ = 'upcoming_things'
   Id = Column(String, primary_key=True, index=True)
   Period = Column(Integer)
   SettlementDate = Column(Date)

Base.metadata.create_all(engine)

with Session(engine) as session:
    q = session.query(
       UpcomingThings
    ).filter(
       or_(
          and_(
             UpcomingThings.Id=='ES1234',
             UpcomingThings.Period==27,
             UpcomingThings.SettlementDate==date(year=2021, month=8, day=18)),
          and_(
             UpcomingThings.Id=='ES0197',
             UpcomingThings.SettlementDate==date(year=2021, month=8, day=18),
             UpcomingThings.Period==29)))
    print (q)


打印输出


SELECT upcoming_things."Id" AS "upcoming_things_Id", upcoming_things."Period" AS "upcoming_things_Period", upcoming_things."SettlementDate" AS "upcoming_things_SettlementDate" 
FROM upcoming_things 
WHERE upcoming_things."Id" = ? AND upcoming_things."Period" = ? AND upcoming_things."SettlementDate" = ? OR upcoming_things."Id" = ? AND upcoming_things."SettlementDate" = ? AND upcoming_things."Period" = ?


【讨论】:

  • 这个答案非常完美,非常感谢。没有关于将 ands 与 ors 结合使用的真正适当的文档,但现在我为不尝试以这种方式使用括号而感到愚蠢!到目前为止,我已经使用联合和子查询解决了这个问题,但这要简单得多,我怀疑会带来更好的性能,因为我将传递更多的参数。
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2015-08-26
  • 2015-01-18
  • 1970-01-01
  • 2010-09-14
  • 2017-03-28
相关资源
最近更新 更多