You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:23:35