首页 > 网站不定时崩溃,日志中记录 sqlalchemy报错,Session's transaction has be...

网站不定时崩溃,日志中记录 sqlalchemy报错,Session's transaction has be...

出错位置大概再这里 (flask项目)

def order_record():
    id=request.args.get("id")
    code=request.args.get("code")
    r=Record()
    r.id=id
    order.code=code
    db.session.add(order)
    db.session.commit()
    return jsonify(status=1)
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (IntegrityError) PRIMARY KEY must be unique

原因感觉是当数据提交的时候因为网络的问题或者用户的问题提交了多次相同的数据导致了unique的错误。
但是我好奇的是日志里会重复报告上面这个错误描述很多次几十次甚至几百次。

解决这个问题,貌似只要再写入的时候确认是否已经存在就可以了,但是我不太理解的是什么日志中会一直重复报这个InvalidRequestError错误。

另外。关于上面这断代码,除了写入前先select以下之外,有没有更优美一点的做法? try catch?
有没有谁能给一个关于插入数据在生产环境下的最佳实践?


@isaced 我也遇到这样的问题,与之不同的是,我没有add操作,只有query操作也会出现
后来在每个query结束之后,加了一个 db.session.rollback()


PRIMARY KEY 要自增啊, 根本不需要用户传进来

插入记录以后将插入记录的ID返回给用户即可


你没有说你使用的是什么数据库。不过似乎无关紧要。

sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (IntegrityError) PRIMARY KEY must be unique

依我使用 psycopg2 的经验,当一个 SQL 事务出错时,唯一能做的就是回滚该事务,否则该会话(好像是与数据库连接同生命期)将不再接受任何语句。

pysycopg2 2.5 之后的版本,连接对象支持 with 语法,它可以用来保证当离开该 with 语句块时,如果没有出问题就提交(commit),如果出了异常就回滚(rollback)。SQLAlchemy 没用过不清楚,如果没有这样的机制的话,你必须手工使用 try...except 来保证出错的事务被回滚,不然该错误会一直存在直到会话结束。


db.session.add(site)
try:
    db.session.commit()
except:
    db.session.rollback()

只要用try...except在except中rollback回滚事务就可以了!

【热门文章】
【热门文章】