假设我的User
模型包含属性id
,name
,email
和关系languages
。
是否可以从现有数据创建一个User
实例,其行为类似于我用dbsession.query(User).get(42)
查询它的行为?
我的意思是,我希望访问user.languages
创建子查询并填充属性。
这是一个代码示例:
我有一个班级User
:
class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String(64))
email = Column(String(64))
languages = relationship('Language', secondary='user_languages')
我的数据库中已存储了很多用户。 我知道我在我的数据库中有这个用户:
user_dict = {
'id': 23,
'name': 'foo',
'email': 'foo@bar',
}
所以我有所有的属性,但关系。
现在我想创建一个sqlalchemy User
实例
并在sqlalchemy的系统中注册它
所以我可以根据需要获得languages
。
user = User(**user_dict)
# Now I can access the id, name email attributes
assert user.id == 23
# but since sqlalchemy thinks it's a new model it doesn't
# lazy load any relationships
assert len(user.languages) == 0
# I want here that the languages for the user with id 23 appear
# So I want that `user` is the same as when I would have done
user_from_db = DBSession.query(User).get(23)
assert user == user_from_db
用例是我有一个很复杂的大模型 关系,但90%的时间我不需要那些数据。 所以我只想缓存直接属性以及我需要的其他内容 然后像上面那样从缓存加载那些并且能够 使用sqlalchemy模型,就像我从db中查询它一样。
[编辑:添加代码示例并重新提出问题]
[编辑2:添加解决方案]
来自sqlalchemy邮件列表:
# to make it look like it was freshly loaded from the db
from sqlalchemy.orm.session import make_transient_to_detached
make_transient_to_detached(user)
# merge instance in session without emitting sql
user = DBSession.merge(user, load=False)