由于会话错误,无法从SQLAlchemy中删除行

Pac*_*aco 4 python flask flask-sqlalchemy

我想从我的表中删除一个条目.这是我删除功能的代码.

@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'))
Run Code Online (Sandbox Code Playgroud)

这一行: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'))
Run Code Online (Sandbox Code Playgroud)

它不会更新数据库.链接不能在会话中我猜,但我不知道如何检查,以及如何解决它.我是sqlalchemy的新手.

编辑:

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

from yourapplication import db
Run Code Online (Sandbox Code Playgroud)

Car*_*s V 14

您正在创建该db对象的2个实例,固有地创建2个不同的会话.

在models.py中:

...
5.  from config import app
6.
7.  db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)

在erika.py:

...
16. from config import app
    ...
23. db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)

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

link = models.Link.query.filter(models.Link.l_id == link_id).first()
db.session.delete(link)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

发生以下情况:

  • 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
Run Code Online (Sandbox Code Playgroud)

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