我有许多类使用SQLAlchemy映射到表(如果重要的话,非声明性地)。因为我希望应用程序可以进行单元测试,所以所有SQLAlchemy会话交互都被隔离到一个类中。使用该应用程序是这样的:
m = Model("mysql://localhost/mydb")
s1 = Service("somename")
m.session.add(s1)
s1 is m.get_service("somename") # True
它实际上比这更精简,但在这里与我合作。
是否可以跳过session.add()步骤?换句话说,如果我实例化一个映射类,是否有可能将其自动添加到活动的SQLAlchemy会话中(如果有的话)?
答案 0 :(得分:5)
在SQLAlchemy中,您只能通过将其元数据绑定到引擎来对表执行此操作。这不适用于SQLALchemy的ORM部分。
这种方法的一种方法是使用可在任何地方访问的范围会话。
答案 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
当然,您需要事先指定映射器之间的“作者”关系。