Python中SQLAlchemy删除实体后如何从原Session移除?
问题描述
我有一段测试代码遇到了问题:我有一个已打开的Session(self.session),其中可能包含不想改动的未提交实体。我需要删除一个确认无关联的Property实体,于是创建新Session完成删除,且已确认该实体已从数据库中移除。但现在我无法将该实体从原self.session中移除,尝试了flush、expire、expunge、expire_all等操作均无效,测试断言始终失败。
初始测试代码
from sqlalchemy.orm import Session, sessionmaker from database.property import Property def get_session() -> Session: engine = create_engine('a legitimate string that connects to my MySql database') session = sessionmaker(bind=engine)() return session class TestingOnly: def __init__(self): self.session = get_session() @staticmethod def in_all(session: Session, prop_id: int) -> bool: all_properties = session.query(Property).all() for p in all_properties: if p.id == prop_id: return True return False @staticmethod def delete_prop(prop): session = get_session() deleting_prop = session.get(Property, prop.id) session.delete(deleting_prop) session.commit() session.close() def start(self): prop = self.session.query(Property).first() prop_id = prop.id assert TestingOnly.in_all(self.session, prop_id) TestingOnly.delete_prop(prop) self.session.flush() self.session.expire(prop) self.session.expunge(prop) self.session.expire_all() ################################# # 此处触发断言错误: assert not TestingOnly.in_all(self.session, prop_id) def main(): testing_only = TestingOnly() testing_only.start() if __name__ == '__main__': main()
第二次修改后的代码(问题依旧)
from sqlalchemy.orm import Session, sessionmaker from database.property import Property class TestingOnly: engine = create_engine('a legitimate string that connects to my MySql database') def __init__(self): self.session = self.get_session() def get_session() -> Session: session = sessionmaker(bind=self.engine)() return session @staticmethod def in_all(session: Session, prop_id: int) -> bool: all_properties = session.query(Property).all() for p in all_properties: if p.id == prop_id: return True return False def delete_prop(self, prop): session = self.get_session() deleting_prop = session.get(Property, prop.id) session.delete(deleting_prop) session.commit() session.close() def start(self): prop = self.session.query(Property).first() prop_id = prop.id assert TestingOnly.in_all(self.session, prop_id) self.delete_prop(prop) # self.session.flush() # self.session.expire(prop) # self.session.expunge(prop) # self.session.expire_all() ################################# # 此处触发断言错误: assert not TestingOnly.in_all(self.session, prop_id) def main(): testing_only = TestingOnly() testing_only.start() if __name__ == '__main__': main()
第三次修改后的代码(问题仍未解决)
from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from database.property import Property class TestingOnly: engine = create_engine('a legitimate string that connects to my MySql database') def __init__(self): self.session = self.get_session() def get_session() -> Session: session = sessionmaker(bind=self.engine)() return session @staticmethod def in_all(session: Session, prop_id: int) -> bool: all_properties = session.query(Property).all() for p in all_properties: if p.id == prop_id: return True return False def delete_prop(self, prop): session = self.get_session() deleting_prop = session.get(Property, prop.id) session.delete(deleting_prop) session.commit() session.close() def add_property() -> int: session = self.get_session() prop = Property() session.add(prop) session.flush() prop_id = prop.id session.commit() session.close() return prop_id def verify_property_exists(self, prop_id: int) -> bool: session = self.get_session() prop = session.get(Property, prop_id) return prop is not None def start(self): prop_id = self.add_property() self.verify_property_exists(prop_id) prop = self.session.get(Property, prop_id) assert self.in_all(self.session, prop_id) self.delete_prop(prop) #self.session.flush() #self.session.expire(prop) #self.session.expunge(prop) #self.session.expire_all() ################################# # 此处触发断言错误: assert not TestingOnly.in_all(self.session, prop_id) def main(): testing_only = TestingOnly() testing_only.start() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者jordanthompson
相关产品推荐
相关产品推荐

