将会话排队到数据库中

问题描述 投票:0回答:1

我正在尝试创建一个 API,用于根据每个请求更新数据库 Postgres SQLAlchemy 中的数据。 收到的每个请求都将调用一个更新函数,该函数使用 sessionmaker() 创建会话,从数据库检索数据并更新并提交回来。 当快速连续发送多个请求并且后续请求实际上检索并更新旧数据(先前请求尚未更新的数据)时,就会出现问题。 例如,对于插入功能,第二个请求将检查并发现没有条目,并尝试在第一个请求将该条目插入数据库之前插入它,这样就会有 2 个条目包含类似的信息。

我尝试了 SQLAlchemy 事务,但似乎无法让它工作。我怀疑这是因为 session.execute() 关闭了事务并在运行 session.add() 之前启动了一个新事务,在它们之间,另一个请求将发送自己的 session.execute() 来检查数据库中是否存在

async def insert(session, bearer_token):
    newdbrow = Token()
    entity={"bearer_token":bearer_token,'id':uuid.uuid1(),'valid':True}
    for key, value in entity.items():
        setattr(newdbrow,key,value)
    async with session.begin():
        statement = select(Token).filter_by(bearer_token=bearer_token)
        rows = await session.execute(statement)
        rows = rows.scalars()
        row = next(rows, None)
        if row is None:
            session.add(newdbrow)
sqlalchemy request transactions queue
1个回答
0
投票

也许尝试插入

upsert
,插入但如果存在则更新:

https://docs.sqlalchemy.org/en/20/orm/queryguide/dml.html#orm-upsert-statements

此外,您可能需要添加约束,以便不能存在重复数据。

© www.soinside.com 2019 - 2024. All rights reserved.