繁体   English   中英

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

[英]Possible to add an object to SQLAlchemy session without explicit session.add()?

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

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

实际上比这更简化,但是请在这里与我合作。

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

在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

实际上,并非一直如此。 如果您在子模型和父模型之间定义了关系,或者是多对多关系,则只需显式添加父对象。 在为子对象分配属性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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM