2013-04-26 43 views
4

我正在使用围绕SQLAlchemy的Flask-SqlAlchemy扩展来使用Python中的SQLite数据库。SQLAlchemy密钥的身份映射中已经存在冲突状态

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

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

mainapp.py

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

views.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')) 

updater.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. 

任何帮助或洞察力WO非常感谢!我已经尝试了很多SqlAlchemy方法,但没有运气(清除平台,合并电影对象,删除会话等)。还尝试将电影格式设置为空白,并在添加新格式之前将更改提交给分贝,但没有更改。

回答

1

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

for format in formats: 
    movie.formats.append(format)