Sqlalchemy.exc.InvalidRequestError:会话处于准备状态
我已经建立了一个像 webapp 这样的社交媒体,它通过无限滚动在你滚动时上传更多帖子。 但是,如果我在滚动时喜欢帖子,我会在开发模式下遇到错误。
我使用 python/flask 作为后端。
如果我滚动我的提要并同时喜欢我的帖子,在开发模式下,错误
"sqlalchemy.exc.InvalidRequestError: This session is in 'prepared' state; no further SQL can be emitted within this transaction."
到目前为止,这仅发生在开发模式而不是生产模式,但我担心如果更多人开始使用它会出现问题。
这是一个只会在开发中出现问题的错误,还是在我获得大量用户时也会出现在生产中?
我已经尝试在我的后端代码中加入 try except 语句来处理错误,但它会导致其他错误,所以我想知道这是一个以后会成为更大问题的问题,还是只是开发中的问题?
谢谢
我尝试添加一个可重现的示例,但很困难
从无限滚动开始。 在这种情况下,我首先加载不同帖子的索引
前端
HTML
<div class="flow">
<div class="flowpost" v-for="post in postlists" :key="post.id" >
<PostTemplate :iterated_list ="post.id" ></PostTemplate>
</div>
</div>
其中 postlists 包含不同帖子的 id
脚本
mounted(){
window.onscroll = () => {
let bottomOfWindow = document.documentElement.scrollTop + window.innerHeight === document.documentElement.offsetHeight;
if (bottomOfWindow) {
this.addmore()
}
};
}
addmore 方法调用 get_index_list_of_posts 函数加载更多帖子
后端
def get_index_of_list_of_posts():
user_id = request.args.get("userid")
group_action_id = request.args.get("group_action_id")
page_nr = request.args.get("page_nr")
total_pages = 0
result_dict = {}
other_posts_query__ = Session.query(mvpUsersToPosts.id).filter(mvpPosts.id==mvpUsersToPosts.mvp_posts_id ).order_by(mvpPosts.datetime.desc())
pagettt = Paginator(other_posts_query__, 4)
p = pagettt.page(page_nr)
post_query = p.object_list
result_post = []
postlist = []
for post in post_query:
result_post = {
"message":message,
"id": post[0]
}
postlist.append(result_post)
result_dict_list = {}
result_dict_list["posts"] = postlist
result_dict_list["current_page_nr"] = page_nr
result_dict_list["total_page_nr"] = total_pages
posts_result = json.dumps(result_dict_list)
return posts_result
然后,我通过从 PostTemplate 组件调用以下后端函数,用其数据填充帖子。
def get_postlista_to_posttemplate():
userid = request.args.get("userid")
postid = request.args.get("postid")
result_post = []
postlist = []
post_query = Session.query( mvpPosts,mvpUsers, mvpUsersToPosts,mvpSolutionTags).filter(mvpUsersToPosts.userid == mvpUsers.id ,mvpUsersToPosts.mvp_posts_id == mvpPosts.id, mvpUsersToPosts.id ==postid, mvpPosts.id==mvpPostsToSolutionTags.mvp_posts_id, mvpSolutionTags.id==mvpPostsToSolutionTags.tagid).all()
get_total_liked_query = Session.query( func.sum(mvpliked.liked)).filter(mvpliked.postid == postid).all()
for post, users,user2post, tag in post_query:
result_post = {
"postid": user2post.id,
"mvp_post_postid" : post.id,
"posttitle":post.posttitle,
"posttype":post.posttype,
"postimage":post.postimagevideo,
'postliked':is_liked,
}
postlist.append(result_post)
posts_result = json.dumps(postlist)
return posts_result
准备状态错误由 get_total_liked_query 发生,然后我将其包装在没有帮助的 try/except 语句中。
然后我可以喜欢使用以下后端功能完成的帖子。
def like_post():
reply = request.get_json()
post_id = reply["post_id"]
user_id= reply["user_id"]
like_query = Session.query(mvpliked.liked).filter(mvpliked.postid == post_id, mvpliked.userid == user_id ).distinct(mvpliked.postid).all()
if len(like_query) ==0:
newrow = mvpliked(postid = post_id, userid = user_id, liked=1)
Session.add(newrow)
Session.commit()
else:
if (like_query[0][0] == 1):
like_value = 0
else:
like_value = 1
Session.query(mvpliked.liked).filter(mvpliked.postid == post_id, mvpliked.userid == user_id ).update({mvpliked.liked: like_value })
Session.commit()
return ""
invalidrequest 错误似乎在像_post() 和 get_postlista_to_posttemplate() 这样的函数同时运行时发生。
会话代码
engine = create_engine(DATABASE_URL_prod)
Base = declarative_base(engine)
def loadDatabaseSession():
Base.metadata.create_all(engine)
DatabaseSession = sessionmaker(bind=engine)
DatabaseSession = DatabaseSession()
return DatabaseSession
Session = loadDatabaseSession()