SQLAlchemy/Pyramid DBSession 刷新问题

2024-10-04 01:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我的设想是: 第一个视图呈现表单,数据转到secend视图,我将其存储在数据库(MySQL)中,并重定向到第三个视图,其中显示了写入数据库的内容:

Stoing to db:
    DBSession.add(object)
    transaction.commit()

DB Session:
    DBSession = scoped_session(sessionmaker(expire_on_commit=False,
                                            autocommit=False, 
                                            extension=ZopeTransactionExtension()))

之后当我刷新我的页面几次有时我可以看到数据库的变化,有时没有,一次旧数据,第二次新数据等等。。。 当我重新启动服务器(本地,pserve)时,数据库数据是最新的。在

也许这是一个创建会议的问题?在


Tags: to数据视图数据库false表单内容db
3条回答

目前还不清楚事务对象是什么,也不清楚它是如何连接到SQLAlchemy数据库会话的。我在金字塔文档中看不到关于事务的任何信息,也没有在代码中看到任何将事务对象链接到SQLAlchemy会话的内容,因此可能缺少一些配置。你基于什么样的代码?在

另外:sessionmaker调用通常在file score处完成,以创建单个会话工厂,然后重复使用该工厂从同一源创建会话对象。"the sessionmaker() function is normally used to create a top level Session configuration which can then be used throughout an application without the need to repeat the configurational arguments."

可能的情况是,由于您正在创建多个会话工厂,因此有些数据本应跨会话共享,但实际上没有共享,因为每个工厂只创建一次。试试just calling sessionmaker once,看看这是否有什么不同。在

检查MySQL的transaction isolation level。在

InnoDB的默认值是REPEATABLE READ:“同一事务中所有一致的读取都会读取第一次读取建立的快照。”

您可以在对create_engine的调用中指定隔离级别。参见SQLAlchemy docs。在

我建议您尝试使用READ COMMITTED隔离级别,看看是否可以解决您的问题。在

我相信你的问题很可能是一个持续的会议。默认情况下,金字塔在提交后会使会话中的所有对象过期——这意味着SQLA将在您下次需要它们时从数据库中获取它们,它们将是新的。在

您已经通过指示“expire\u on_commit=False”覆盖了此默认值--因此,请确保在提交更改后调用session.expire\u全部()如果希望该会话对象在后续请求中获取新数据。(对于金字塔中的多个请求,session对象是相同的,但是不能保证获得相同的线程范围的会话)我建议不要将expire-on-commit设置为false,或者使用非全局会话:请参见http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#using-a-non-global-session

或者,您可以确保在必要时使对象过期,知道未过期的对象将按原样保留在内存中,不会被刷新,并且可能与不同线程范围会话中的同一对象不同。在

相关问题 更多 >