5

我正在使用围绕 SQLAlchemy 的 Flask-SqlAlchemy 扩展来处理 Python 中的 SQLite 数据库。

我在“格式”和“电影”模型之间建立了多对多的关系。我已成功设置关系并毫无问题地执行了查询。当我尝试更新电影格式时会出现问题。调用我的更新方法会导致AssertionError: A conflicting state is already present in the identity map for key (<class 'moviecode.models.Format'>, (1,))

此错误使我认为 SQLAlchemy 会话在更新调用/数据库查询之间没有被正确删除/清理,但添加 remove() 调用没有帮助。

主应用程序.py

app = Flask('moviecode')
db = SQLAlchemy(app)

视图.py

from updater import updateMovie

@app.route("/admin/movies/<int:movieId>/refresh/",methods=['GET'])
@login_required
def refreshMovie(movieId):
     updateMovie(movieId)
     return redirect(url_for('admin'))

更新程序.py

from mainapp import db
from models import Format, Movie

def updateMovie(movieId):
    movie = Movie.query.filter_by(id=movieId).first()
    formats = Format.query.all()
    movie.formats = newFormats #ERROR IS THROWN HERE
    db.session.commit()
    db.session.remove() #Trying to clean up Session. Makes no difference.

任何帮助或见解将不胜感激!我尝试了很多 SqlAlchemy 方法,但都没有成功(删除平台、合并电影对象、删除会话等)。还尝试将电影格式设置为空白并将更改提交到数据库,然后再添加回新格式,但没有更改。

4

1 回答 1

1

您需要将结果中的每个项目附加到movie.formats关系中。

for format in formats:
    movie.formats.append(format)
于 2013-09-08T14:19:43.037 回答