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

新手学习时,遇到一个问题,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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
迷茫

我昨天晚上继续查了一些资料,解决方案如下:

一旦视图函数内涉及db.session的操纵,在函数内进行 from models import db

即正常。

洪涛

1.去掉 db.session.add(user) 试一下
2.将 import 引入 放在文件头部

黄舟

结论:

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

原因:

之前我在自己负责的模块中设置了一个个人使用的db,用于自己模块的运行和测试;
 后来leader在服务器代码的根下面建立了一个新的db,然后修改了我部分代码,使它们使用新的db;
 然后我自己调试自己代码时,就报了上述错误;
 原因是我有部分代码还是使用原先的db,与新的db会话发生冲突;
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!