gpt4 book ai didi

python - 使用 sqlalchemy 延迟更改

转载 作者:行者123 更新时间:2023-12-05 05:27:14 26 4
gpt4 key购买 nike

我在多进程环境中遇到了一个奇怪的行为。

我的第一个进程(后来称为 P1)通过 sqa 写入 db。我的第二个进程(后来称为 P2)通过 sqa 从 db 读取。第二个进程是一个 Web 应用程序,它通过 ajax 调用请求最新数据。

当 P1 更新数据(写入)时,P2 不会立即看到更改(读取)。在实际看到数据库更改之前,它必须进行多次轮询 (发出 session.query(...))。如果我运行另一个 P3 进程,我可以看到更改实际上是在数据库中完成的,但 P2(网络应用程序)不会立即看到它。

我在 Ubuntu 13.04 上运行 sqa 0.8.4(底层数据库:sqlite),我的网络应用程序基于 cherrypy 框架 (3.2.0)

我使用作用域 session 来获取线程安全的 session 对象,如 SQLAlchemy documentation

这是我所有进程使用的 OrmManager 类:

class OrmManager:

def __init__(self, database, metadata, echo=False):
self.database = database

engine = create_engine('sqlite:///' + database,
echo=echo,
connect_args={'detect_types': sqlite3.PARSE_DECLTYPES|
sqlite3.PARSE_COLNAMES},
native_datetime=True,
poolclass=NullPool,
convert_unicode=True
)

metadata.create_all(engine)

# this factory is thread safe: a session object is returned (always the same) to the
# caller. If called from another thread, the returned session object will be different
session_factory = sessionmaker(bind=engine, expire_on_commit=False)
self.session = scoped_session(session_factory)

def get_session(self):

session = self.session()
return session

P1、P2 和 P3 实现一个 OrmManager 并使用返回的 session 如下:

orm_mgr = OrmManager(database=<path/to/my/.sqlite/file>, metadata=METADATA)

session = orm_mgr.get_session()

# do some stuff here

session.commit()

我检查了 P1 代码。数据库更改已提交 (调用 session.commit()) 但与 P3 相比,P2(网络应用程序) 无法实时看到更改(命令行进程)。 P2 可能需要几秒钟才能得到零钱...

有什么想法吗?

非常感谢,

皮埃尔

最佳答案

发现问题。根据 SQLAlchemy 文档,每次 Web 请求后都必须调用 Session.remove()。

我将以下代码添加到我的 cherrypy 应用程序中:

def on_end_request():
"""As mentioned in SQLAlchemy documentation,
scoped_session .remove() method has to be called
at the end of each request"""

Session.remove()

和:

cherrypy.config.update({'tools.dbsession_close.on' : True})

# As mentioned in SQLAlchemy documentation, call the .remove() method
# of the scoped_session object at the end of each request
cherrypy.tools.dbsession_close = cherrypy.Tool('on_end_request', on_end_request)

现在工作正常。

HTH 其他人,

皮埃尔

关于python - 使用 sqlalchemy 延迟更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109794/

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