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" = ?
我想知道是否有人可以帮助我将此 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" = ?