提交对数据库的更改后,我偶尔会收到sqlalchemy.exc.OperationalError

时间:2019-07-19 13:35:06

标签: python flask sqlalchemy

几天前,我迁移了数据库架构,此后,我偶尔会得到OperationalError。我调试了代码,并意识到只要想在前一天更改其架构的模型上提交更改,它就会发生。

运行这两个功能时出现错误:

    def delete(self, commit=True):
        photos = Resource.query.filter(Resource.property_id == self.id)

        for photo in photos:
            photo.delete()

        db.session.delete(self)
        if commit:
            db.session.commit()

    @classmethod
    def delete_inactives(cls, inactive_past_hours=0, commit=True):
        delta = datetime.utcnow() - timedelta(hours=inactive_past_hours)
        query = cls.query.yield_per(100).filter(
            cls.active == False, cls.deactivation_date <= delta
        )
        candidates = query_generator(query)
        for item in candidates:
            logger.info(f"Deleting Property {item.id}")
            item.delete(False)
        if commit:
            db.session.commit()

在delete_inactives方法运行后,经过一些迭代后出现OperationalError错误。在出现错误后,我设法用以下代码重现错误:

property = Property.query.filter_by(id='08f2bf986323b4ab2448f11392ae689ad40bf827').one()
db.session.delete(property)
db.session.commit()

但是几分钟后,我重新运行了代码,但没有收到任何错误!

我收到的错误消息:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
 [SQL: 'DELETE FROM property WHERE property.id = %(id)s'] [parameters: {'id': '08f2bf986323b4ab2448f11392ae689ad40bf827'}] (Background on this error at: http://sqlalche.me/e/e3q8)

1 个答案:

答案 0 :(得分:0)

这可能是由多种原因引起的,我强烈建议您检查数据库服务器的日志。

错误状态表明,这可能不是您所犯的错误。

  

OperationalError Exception 引发了与   数据库的操作,并且不一定要在   程序员发生意外的断开连接,数据源名称   找不到,无法处理交易,内存   处理期间发生分配错误等。

     

此错误是DBAPI错误,起源于数据库驱动程序   (DBAPI),而不是SQLAlchemy本身。

     

OperationalError是最常见(但不是唯一)错误类   驱动程序在数据库连接上下文中使用   掉线或无法连接到数据库。有关如何操作的提示   要解决此问题,请参阅“处理断开连接”一节。

http://sqlalche.me/e/e3q8

例如,可能由于连接断开而发生。