从dict加载sqlalchemy orm模型

时间:2016-12-15 07:05:44

标签: python sqlalchemy

假设我的User模型包含属性idnameemail和关系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)

0 个答案:

没有答案