SQL Alchemy ORM bracketing And statements with OR statements

SQL alchemy ORM bracketing And statements with OR statements

我想知道是否有人可以帮助我将此 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 (bracket and condition) OR (bracket and condition)

编辑: 如果 sql 炼金术这么简单,这就是我假设 _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!谢谢。

我认为事后会很清楚,但您需要使用 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" = ?