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)
这样,您始终使用用于获取记录的相同会话.