【问题标题】:Create ORM object from dict and add to session从 dict 创建 ORM 对象并添加到会话
【发布时间】:2017-04-30 17:02:54
【问题描述】:

假设我有一个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 模型,就像我从数据库中查询它一样。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    来自 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)
    

    这个答案是从问题中提取的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多