【问题标题】:sqlalchemy update not commiting changes to database. Using single connection in an appsqlalchemy 更新不提交对数据库的更改。在应用程序中使用单一连接
【发布时间】:2013-06-18 14:08:51
【问题描述】:

我在 pyqt 桌面应用程序中使用 sqlalchemy。当我执行并更新到数据库时,更改不会反映在数据库中,如果我检查会话对象“sqlalchemy.orm.scoping.ScopedSession”,它告诉我我的对象不存在于会话中,但如果我尝试添加它告诉我已经存在。 我管理连接的方式如下,当应用程序启动时我打开一个连接并保持它打开所有用户会话,当应用程序关闭时我关闭连接。因此,所有查询都只打开一个连接。

selected_mine = Mine.query.filter_by(mine_name="some_name").first()
''' updating the object attributes '''
selected_mine.region = self.ui.region.text() 
self.sqlite_model.conn.commit()

我检查了会话,有两个不同的对象(我不知道为什么)。

s=self.sqlite_model.conn()
>>> s
<sqlalchemy.orm.session.Session object at 0x30fb210>
s.object_session(selected_mine)
>>> <sqlalchemy.orm.session.Session object at 0x30547d0>

我该如何解决这个问题?为什么提交它不起作用?

我在 SqliteModel 类(对象 self.sqlite_model 的类)中创建会话

Session = scoped_session(sessionmaker(autocommit=False, bind=self.engine))
self.conn = Session()

Base.query = Session.query_property()        

''' connect to database '''
Base.metadata.create_all(bind=self.engine)

【问题讨论】:

  • 如何创建第一个session 对象?

标签: python sqlalchemy


【解决方案1】:

您没有显示 Mine 类是什么,但我相信您的问题在于这一行:

selected_mine = Mine.query.filter_by(mine_name="some_name").first()

您实际上并没有使用您最初设置的会话来查询数据库,因此正在为您创建一个新会话。我相信你的代码应该是这样的:

selected_mine = self.conn.query(Mine).filter_by(mine_name="some_name").first()

如果您还没有这样做,那么您绝对应该浏览一下 SQLAlchemy 提供的 excellent documentation,其中解释了 Session 是什么以及如何使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多