在SQLAlchemy中使用PostgresSQL INTERVAL,其中持续时间动态存储在DB中,并且不是参数

2024-09-28 03:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这不是this问题的重复,因为这个问题是/可以用一个参数或常数区间来解决的。在我的例子中,间隔是在一个表中定义的。我的直觉告诉我以下几点应该有用:

from sqlalchemy import func
from sqlalchemy.dialects.postgresql import INTERVAL
...
company_uuid = 'some_uuid'
query = db.session.query(CompanyFlagEntity)\
    .join(CompanyFlagTypeEntity)\  # implicit join using fk
    .filter(CompanyFlagEntity.company_uuid == company_uuid)\
    .filter((func.now() - INTERVAL(CompanyFlagTypeEntity.default_lookback_days, 'DAY')) <= CompanyFlagEntity.flag_date)

但是我得到一个错误:

AttributeError: 'INTERVAL' object has no attribute 'comparator'

SQL版本为:

select company_flag.*
from company_flag
join company_flag_type on company_flag_type.uuid = company_flag.company_flag_type_uuid
where
    company_flag.company_uuid = 'my_uuid' and 
    (now() - (company_flag_type.default_lookback_days || ' days')::interval) <= flag_date

Tags: fromimportuuidsqlalchemytypefilterquerydays
1条回答
网友
1楼 · 发布于 2024-09-28 03:12:21

当我手动编写SQL时,解决方案从SQL中消失了:

from sqlalchemy import func
from sqlalchemy.dialects.postgresql import INTERVAL
from sqlalchemy.sql.functions import concat
...
company_uuid = 'some_uuid'
query = db.session.query(CompanyFlagEntity)\
    .join(CompanyFlagTypeEntity)\  # implicit join using fk
    .filter(CompanyFlagEntity.company_uuid == company_uuid)\
    .filter((func.now() - func.cast(concat(db_base_app.CompanyFlagTypeEntity.default_lookback_days, ' DAYS'), INTERVAL)) <= cls.flag_date)

引用的This有助于首先了解如何动态创建间隔。你知道吗

相关问题 更多 >

    热门问题