可以在没有显式session.add()的情况下将对象添加到SQLAlchemy会话中吗?

时间:2010-11-06 23:55:35

标签: python sqlalchemy

我有许多类使用SQLAlchemy映射到表(如果重要的话,非声明性地)。因为我希望应用程序可以进行单元测试,所以所有SQLAlchemy会话交互都被隔离到一个类中。使用该应用程序是这样的:

m = Model("mysql://localhost/mydb")
s1 = Service("somename")
m.session.add(s1)
s1 is m.get_service("somename") # True

它实际上比这更精简,但在这里与我合作。

是否可以跳过session.add()步骤?换句话说,如果我实例化一个映射类,是否有可能将其自动添加到活动的SQLAlchemy会话中(如果有的话)?

2 个答案:

答案 0 :(得分:5)

在SQLAlchemy中,您只能通过将其元数据绑定到引擎来对表执行此操作。这不适用于SQLALchemy的ORM部分。

http://www.sqlalchemy.org/docs/core/schema.html?highlight=metadata#binding-metadata-to-an-engine-or-connection

这种方法的一种方法是使用可在任何地方访问的范围会话。

http://www.sqlalchemy.org/docs/orm/session.html?highlight=scoped%20session#sqlalchemy.orm.scoped_session

答案 1 :(得分:2)

实际上,并不是所有的时间。 如果已定义子模型与父模型之间的关系,或多对多关系,则只需显式添加父对象。在分配属性parent时会自动添加子对象,该属性始终位于db / session中。例如:

a1 = Author(name='Pynchon') # out of session
session.add(a1) # in session
b1 = Book(name='Gravity`s Rainbow') # out of session
b1.author = a1 #in session
a2 = session.query(Author).filter(name='Eco').one() # in session
b2 = Book(name='Baudolino') # out of session
b2.author = a2 # in session

当然,您需要事先指定映射器之间的“作者”关系。