使用SQLAlchemy从数据库中删除帖子会出现错误:“对象'...'已连接到会话”

时间:2019-10-15 23:14:20

标签: python flask sqlalchemy

我正在尝试使用帖子ID从数据库中删除帖子,但我不断收到以下错误。

sqlalchemy.exc.InvalidRequestError:对象”已附加到会话“ 34”(此为“ 35”)。

我想做的事情应该非常简单,但是我没有足够使用SQLAlchemy来确定这意味着什么以及如何解决它。

我有一条删除帖子的方法,如下所示:

@app.route('/delete_post')
def delete_post():

    post_id = request.args.get('post_id')

    deleted_post = posts.query.filter_by(id=post_id).first()
    db.session.delete(deleted_post)
    db.session.commit()

    flash('Post deleted!', 'success')
    return redirect(url_for('admin_posts'))

所有路线应该做的是从上一页传递的URL中获取post_id变量,查询数据库以查找ID为post_id的所有帖子,然后删除匹配的帖子。我只是不断收到上面发布的错误。

我不认为问题出在代码上,应该按照我的理解来解决。我认为问题出在SQLAlchemy db.sessions上,我以某种方式滥用了它。

我还应该注意,在该应用程序的其余部分中,我已经多次使用SQLAlchemy来创建帖子,回复和帐户,并且它们都有效。问题就在于此。

2 个答案:

答案 0 :(得分:0)

我相信您无意中创建了2个会话,并将相同的对象粘贴到两个会话中。

此行

posts.query.filter_by(id=post_id).first()

最有可能使用一个会话(很难说没有此模型代码)。

然后

db.session.delete(deleted_post)

可能正在使用其他会话。

解决方案是对两个操作使用相同的会话。

尝试从posts模型所使用的模块中导入会话。

答案 1 :(得分:0)

所以我让它工作了,问题出在我的进口商品上...

我不确定为什么会这样,或更重要的是,但是,我没有正确地从route.py中的init.py导入。

我有:

from app import app

但需要:

from app import app, db

明显的和愚蠢的错误,但是我认为一切正常,因为我的所有其他SQLAlchemy功能都可以正常工作,例如插入和查询...非常奇怪。