5

我正在尝试从我的表中删除一个条目。这是我的删除功能代码。

@app.route("/delete_link/<link_id>", methods=['GET', 'POST'])
def delete_link(link_id):
    link = models.Link.query.filter(models.Link.l_id == link_id).first()
    db.session.delete(link)
    db.session.commit()
    return flask.redirect(flask.url_for('links'))

该行:db.session.delete(link)返回我这个错误:

InvalidRequestError:对象“”已附加到会话“1”(这是“2”)

我也试过这段代码:

@app.route("/delete_link/<link_id>", methods=['GET', 'POST'])
def delete_link(link_id):
    link = models.Link.query.filter(models.Link.l_id == link_id)
    link.delete()
    db.session.commit()
    return flask.redirect(flask.url_for('links'))

这不会更新数据库。我猜链接一定不在会话中,但我不知道如何检查,以及如何修复它。我是 sqlalchemy 的新手。

编辑

我用它来创建我的 db 变量,它可能在这个阶段创建会话(这是在代码的顶部)。它来自烧瓶文档

from yourapplication import db
4

2 回答 2

14

您正在创建db对象的 2 个实例,本质上创建了 2 个不同的会话。

在模型.py 中:

...
5.  from config import app
6.
7.  db = SQLAlchemy(app)

在 erika.py 中:

...
16. from config import app
    ...
23. db = SQLAlchemy(app)

然后当您尝试删除元素时:

link = models.Link.query.filter(models.Link.l_id == link_id).first()
db.session.delete(link)
db.session.commit()

发生以下情况:

  • models.Link.query使用由models.py创建的数据库会话来获取记录。
  • db.session.delete使用erika.py创建的会话。
  • link附加到models.py会话,您不能使用另一个会话(erikas.py)来删除它。因此:

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

解决方案

解决方法很简单。任何时候都只有一个对象的实例,db并在需要db操作时重用该实例。

erika.py

from models import db

这样,您始终使用用于获取记录的同一会话。

于 2013-06-20T23:48:17.750 回答
1

这似乎与http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profiling中描述的问题类似。 这是一个很好的深入描述问题以及他是如何解决的。那篇文章的作者做了一个修复,可以作为一个分支使用。

修复

为了解决这个问题,我们需要找到一种将 Flask-WhooshAlchemy 的查询对象附加到模型的替代方法。

Flask-SQLAlchemy 的文档提到有一个 model.query_class 属性,其中包含用于查询的类。这实际上是一种让 Flask-SQLAlchemy 使用自定义查询类的方法比 Flask-WhooshAlchemy 所做的更简洁。如果我们将 Flask-SQLAlchemy 配置为使用启用 Whoosh 的查询类(它已经是 Flask-SQLAlchemy 的 BaseQuery 的子类)创建查询,那么我们应该得到与以前相同的结果,但没有错误。

我在 github 上创建了 Flask-WhooshAlchemy 项目的一个分支,并在其中实现了这些更改。如果您想查看更改,您可以查看我的提交的 github 差异,或者您也可以下载固定扩展并将其安装在原来的 flask_whooshalchemy.py 文件的位置。

于 2013-06-20T20:53:28.817 回答