假设我有一个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',
}
所以我拥有除了关系之外的所有属性。
现在我想做一个 sqlalchemyUser
实例
并将其注册到 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 模型,就像我从数据库查询它一样。