我的设想是: 第一个视图呈现表单,数据转到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)时,数据库数据是最新的。在
也许这是一个创建会议的问题?在
目前还不清楚事务对象是什么,也不清楚它是如何连接到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
或者,您可以确保在必要时使对象过期,知道未过期的对象将按原样保留在内存中,不会被刷新,并且可能与不同线程范围会话中的同一对象不同。在
相关问题 更多 >
编程相关推荐