这是一些示例代码:
users_groups = Table('users_groups', Model.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('group_id', Integer, ForeignKey('groups.id'))
)
class User(Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
class Group(Model):
__tablename__ = 'groups'
id = Column(Integer, primary_key=True)
users = relationship('User', secondary=users_groups, lazy='select', backref='groups')
users_dynamic = relationship('User', secondary=users_groups, lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)
那么这里发生的是,如果你将一堆用户添加到这样的组:
g = Group()
g.users = [User(), User(), User()]
session.add(g)
session.commit()
Run Code Online (Sandbox Code Playgroud)
然后尝试删除该组
session.delete(g)
session.commit()
Run Code Online (Sandbox Code Playgroud)
您将收到某种形式的此错误:
DELETE statement on table 'users_groups' expected to delete 3 row(s); Only 0 were matched.
Run Code Online (Sandbox Code Playgroud)
删除关系的第二个版本(在我的情况下是动态的)解决了这个问题.我甚至不确定从何处开始理解为什么会发生这种情况.在我的SQLAlchemy模型中,我在很多情况下一直使用两种版本的各种关系,以便在给定情况下轻松使用最合适的查询策略.这是第一次引发意外问题.
欢迎任何建议.
我有User和Post的基本模型.在我的用户模型中,我有
posts = db.relationship('Post', backref='user', lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)
但是,当我做的事情
return render_template('user.html', users=users)
Run Code Online (Sandbox Code Playgroud)
我想做的事情
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.posts|length }}</td>
</tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.帖子是查询,而不是b/c的对象lazy='dynamic'.如果我更改lazy='joined',我可以执行上述操作,但随后我会在查询用户时为用户加载所有帖子.
我尝试添加.options(joinedload('posts'))到我的查询,但它说
InvalidRequestError:'User.posts'不支持对象填充 - 无法应用急切加载.
任何帮助表示赞赏.