python - sqlalchemy的报错: is already attached to session '1' (this is '2')
高洛峰
高洛峰 2017-04-17 15:15:28
0
3
440

新手学习时,遇到一个问题,GG查了下,看得不是很明白,因此这里请教一下。

要实现的:用户列表有一个「禁言」操作,点击后更新该用户的禁言字段的布尔值。

「禁言」操作是通过视图函数实现的:

@app.route('/member/status-false/<int:user_id>')
@login_required
def status_false(user_id):
    from models import Member
    user = Member.query.filter_by(id=user_id).first()
    user.status = '0'  #禁用用户
    db.session.add(user)
    db.session.commit()
    return redirect(url_for('member'))

运行后,点击「禁言」Flask报错:

sqlalchemy.exc.InvalidRequestError: Object '' is already attached to session '1' (this is '2')

报错的问题大致理解是会话绑定对象乱掉了,但是不知道怎么修改上面的代码使得目的可以实现。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(3)
迷茫

I continued to check some information last night, and the solution is as follows:

Once the manipulation of db.session is involved in the view function, perform from models import db

within the function.

That’s normal.

洪涛

1. Remove db.session.add(user) and try it
2. Place the import introduction at the head of the file

黄舟

Conclusion:

两个不同的db交叉混用导致问题,根据报错也可看出,要操作的对象已经隶属于会话1,
 而现在这个请求已经是会话2了。

Reason:

之前我在自己负责的模块中设置了一个个人使用的db,用于自己模块的运行和测试;
 后来leader在服务器代码的根下面建立了一个新的db,然后修改了我部分代码,使它们使用新的db;
 然后我自己调试自己代码时,就报了上述错误;
 原因是我有部分代码还是使用原先的db,与新的db会话发生冲突;
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template