如何使session.expunge_all()工作从SQLAlchemy中的会话中分离所有实例?

时间:2014-01-07 09:36:54

标签: python mysql session sqlalchemy

我创建了一个SQLAlchemy session

from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
session.autoflush = False

我正在为多个POST请求使用相同的会话对象。我第一次向这个会话对象添加一个对象,并且执行session.commit()时,该对象通过INSERT查询插入到MySQL中。但是下次当我再次使用与session.add()相同的会话时,旧对象会使用UPDATE查询进行更新。我是commit()我的第一个INSERT并将实例分离为session.expunge_all()但仍然是这样。

    def new(self, **kwargs):
      self.firstname = kwargs['firstname']
      self.lastname = kwargs['lastname']
      session.add(self)
      session.commit()
      session.expunge_all()

这是否意味着我每次使用它来更新数据库时都必须创建一个新的会话对象?或者从会话中分离实例的代码中存在一些逻辑错误?

1 个答案:

答案 0 :(得分:1)

是的,您应该在new的开头创建一个新的会话实例。之后您也不需要致电expunge_all。会话对象不需要任何费用,因此您可以根据需要使用它们。

然而,这段代码仍然很奇怪。你确定下面的例子不是你想要的吗?

您映射的类定义:

class MyObject(Base):
    def __init__(self, *args, **kwargs):
        self.firstname = kwargs['firstname']
        self.lastname = kwargs['lastname']

用法:

session = Session()
my_ob = MyObject(firstname='John', lastname='Smith')
session.add(my_ob)
session.commit()
session.close()