相关疑难解决方法(0)

SQLAlchemy DELETE由于具有延迟加载和相同关系的动态版本而导致的错误

这是一些示例代码:

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模型中,我在很多情况下一直使用两种版本的各种关系,以便在给定情况下轻松使用最合适的查询策略.这是第一次引发意外问题.

欢迎任何建议.

python mysql sqlalchemy

9
推荐指数
1
解决办法
3114
查看次数

如何让Flask-SQLAlchemy对象为Jinja模板加载关系子元素?

我有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'不支持对象填充 - 无法应用急切加载.

任何帮助表示赞赏.

python sqlalchemy jinja2 flask flask-sqlalchemy

7
推荐指数
1
解决办法
4794
查看次数

标签 统计

python ×2

sqlalchemy ×2

flask ×1

flask-sqlalchemy ×1

jinja2 ×1

mysql ×1