gpt4 book ai didi

python - sqlalchemy 缓存一些查询

转载 作者:行者123 更新时间:2023-11-28 21:27:23 25 4
gpt4 key购买 nike

我在实时网站上运行这个。当用户登录时,我查询他的个人资料以查看他有多少“积分”可用。积分是通过 Paypal 购买的。如果一个人购买积分并且付款通过,查询仍然显示 0 积分,即使我在 phpmyadmin 中运行相同的查询它会带来正确的结果。如果我重新启动 apache 网络服务器并重新加载页面,则会显示正确的学分数。这是我的映射器代码,它显示了每个用户拥有的积分数:

mapper( User, users_table, order_by = 'user.date_added DESC, user.id DESC', properties = {
'userCreditsCount': column_property(
select(
[func.ifnull( func.sum( orders_table.c.quantity ), 0 )],
orders_table.c.user_id == users_table.c.id
).where( and_(
orders_table.c.date_added > get_order_expire_limit(), # order must not be older than a month
orders_table.c.status == STATUS_COMPLETED
) ).\
label( 'userCreditsCount' ),
deferred = True
)
# other properties....
} )

我在 flask 框架中使用 sqlalchemy 但没有使用他们的 flask-sqlalchemy 包(只是纯 sqlalchemy)

以下是我启动数据库的方式:

engine = create_engine( config.DATABASE_URI, pool_recycle = True )
metadata = MetaData()
db_session = scoped_session( sessionmaker( bind = engine, autoflush = True, autocommit = False ) )

我在这个项目中学习了 python 和 sqlalchemy,所以我可能会遗漏一些东西,但这个让我抓狂。有什么想法吗?

最佳答案

当您使用 Session 时,一旦它开始使用连接,它就会保持连接直到调用 commit()、rollback() 或 close()。使用 DBAPI,与数据库的连接也保留在事务中,直到事务被提交或回滚。

在这种情况下,当您将数据加载到 session 中时,SQLAlchemy 不会刷新数据,直到事务结束(或者如果您使用 expire() 显式地使部分数据过期)。这是自然行为,因为 transaction isolation ,很可能当前事务无法看到在任何情况下自该事务开始以来发生的更改。

因此,虽然使用 expire() 或 refresh() 可能是也可能不是如何将最新数据放入 session 的一部分,但实际上您需要结束事务并开始一个新事务才能真正看到自从其他地方发生了什么变化那笔交易开始了。您应该组织您的应用程序,以便特定的 Session() 在新请求进入时准备就绪,但是当该请求完成时, Session() 应该关闭,并且一个新的(或至少是一个新的事务)在下一个请求时启动。

关于python - sqlalchemy 缓存一些查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com