0

我在 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)
4

1 回答 1

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 提供的解释 a是什么以及如何使用它的优秀文档。Session

于 2013-06-18T06:08:51.863 回答