【发布时间】: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