使用Beaker Cache和SQLAlchemy

1 投票
1 回答
1510 浏览
提问于 2025-04-16 12:01

我正在尝试用 Beaker 缓存和 SQLAlchemy 一起工作,但遇到了一些错误。

这是我的表定义。

class Post(Base):
  ....
  ....

  user = relation(User, primaryjoin = User.id == id)
  tags = relation('Tags', backref = 'posts')


class Tags(Base):
  ...
  ...

  user = relation(User, primaryjoin = User.id == id)
  post = relation(Post, primaryjoin = Post.id == id)

Beaker 缓存可以和其他 SQLAlchemy 类一起使用,但这些类不行。

当我运行程序时,出现了以下错误:

DetachedInstanceError: Parent instance <Post at 0x101f90b10> is not bound to a Session; lazy load operation of attribute 'user' cannot proceed.

我在 StackOverflow 上查找过,发现另一个帖子提到我需要关闭懒加载,所以我把这一行改成了

user = relation(User, primaryjoin = User.id == id)

变成了

user = relation(User, primaryjoin = User.id == id, lazy='dynamic')

但是在模板中(post.user.fullname)又出现了以下错误:

AttributeError: 'AppenderQuery' object has no attribute 'fullname'

我到底哪里做错了呢?

1 个回答

2

当你从缓存中获取对象时,应该把它们和一个会话对象关联起来,比如:

obj_from_cache = get_from_cache(key)
session.merge(obj_from_cache)

撰写回答