【问题标题】:SQLAlchemy warning "Coercing Function object into a select() for use in IN()"SQLAlchemy 警告“将函数对象强制转换为 select() 以便在 IN() 中使用”
【发布时间】:2023-01-05 22:28:37
【问题描述】:

我正在尝试根据为 UserAccount 设置的允许时区从下面的 ThingsToDo 模型中进行选择。 UserAccount 模型存储 allowed_time_zones 的列表,而 ThingsToDo 模型具有可以运行事物的时区。

class UserAccount(Base):
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    email = Column(String, index=True, nullable=False, unique=True)
    allowed_time_zones = Column(ARRAY(Text()), index=True)
    account_status = Column(Boolean())


class ThingsToDo(Base):
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    user_id = Column(
        UUID(as_uuid=True), ForeignKey("useraccount.id"), nullable=False
    )
    allowed_timezone = Column(Text(), index=True)
    time_next_thing_allowed_utc = Column(db.DateTime, default=datetime.utcnow)


class Campaigns(Base):
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    user_id = Column(
        UUID(as_uuid=True), ForeignKey("useraccount.id"), nullable=False
    )
    campaign_running = Column(Boolean())

我写的查询实际上有效,但我收到以下警告

SAWarning: Coercing Function object into a select() for use in IN(); please pass a select() construct explicitly
  (ThingsToDo.allowed_timezone.in_(func.unnest(UserAccount.allowed_time_zones))) |
db.session.query(UserAccount.id, ThingsToDo.id) \
            .filter(UserAccount.id == ThingsToDo.user_id, 
                    Campaigns.user_id == UserAccount.id,
                    ) \
                    .filter(
                        (ThingsToDo.allowed_timezone.in_(func.unnest(UserAccount.allowed_time_zones))) |
                            (ThingsToDo.allowed_timezone == None) ) \
                    .filter(UserAccount.account_status == True) \
                    .filter(Campaigns.campaign_running == True) \
                    .filter(datetime.utcnow() > ThingsToDo.time_next_thing_allowed_utc ) \
                    .distinct(ThingsToDo.id) \
                    .all()

我不太确定这个错误是什么意思或如何避免它?我也不确定这是否是执行此查询的最佳方式,我想有更优雅的方式吗?有时查询失败并且查询被关闭,我假设是 postgres。

【问题讨论】:

    标签: postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我通过在 func.unset 语句之前添加 sa.select 来解决这个问题。

    sqlalchemy 实际上会自动将其添加到 SQL 查询中,它只是希望您出于某种原因明确指定它。

    db.session.query(UserAccount.id, ThingsToDo.id) 
                .filter(UserAccount.id == ThingsToDo.user_id, 
                        Campaigns.user_id == UserAccount.id,
                        ) 
                        .filter(
                            (ThingsToDo.allowed_timezone.in_(sa.select(func.unnest(UserAccount.allowed_time_zones)))) |
                                (ThingsToDo.allowed_timezone == None) ) 
                        .filter(UserAccount.account_status == True) 
                        .filter(Campaigns.campaign_running == True) 
                        .filter(datetime.utcnow() > ThingsToDo.time_next_thing_allowed_utc ) 
                        .distinct(ThingsToDo.id) 
                        .all()
    

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 2017-08-21
      • 2015-07-02
      • 2012-05-31
      • 2012-05-30
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多