如何使用 SQLAlchemy 基于另一个表上的条件更新表。.Join() 不适用于 .更新()



我在python fastapi项目中使用SQLAlchemy作为ORM。我有一个端点,它正在更新表中的几行。但是,我只希望在联接表中的字段设置为false时更新这些行。

很遗憾,.Update方法不支持.Join((。

我的代码如下:

@Session
async def update_special_user_id(session: AsyncSession, old_user_id: str, user_id: str):
await session.execute(
update(SpecialUsers)
.join(Users)
.where(Users.is_claimed.is_(False))
.where(SpecialUsers.user_id == old_user_id)
.values({"user_id": user_id})
)

CCD_ 1在这里以与CCD_ 2的FK关系加入。如果Users记录中有字段is_claimed == False,我只想更新SpecialUsers中的user_id

我看过,但没有用。我发现的大多数关于SQLAlchemy的帖子都很旧,而且在1.0中发生了变化。

有什么想法吗?

我的后端正在运行postgres

实现这一点的一种方法是为应该更新的ID创建一个SELECT,并将其用作UPDATEIN子句的左侧。

这是同步代码,但异步版本应该相同。

with Session() as s, s.begin():
selectable = (
sa.select(SpecialUsers.id)
.join(Users)
.where(Users.is_claimed.is_(False))
.where(SpecialUsers.user_id == old_user_id)
)
s.execute(
sa.update(SpecialUsers)
.where(SpecialUsers.id.in_(selectable))
.values({'user_id': user_id})
.execution_options(synchronize_session='fetch')
)

此处讨论synchronize_session执行选项。

最新更新