几天前,我迁移了数据库架构,此后,我偶尔会得到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)
答案 0 :(得分:0)
这可能是由多种原因引起的,我强烈建议您检查数据库服务器的日志。
错误状态表明,这可能不是您所犯的错误。
OperationalError Exception 引发了与 数据库的操作,并且不一定要在 程序员发生意外的断开连接,数据源名称 找不到,无法处理交易,内存 处理期间发生分配错误等。
此错误是DBAPI错误,起源于数据库驱动程序 (DBAPI),而不是SQLAlchemy本身。
OperationalError是最常见(但不是唯一)错误类 驱动程序在数据库连接上下文中使用 掉线或无法连接到数据库。有关如何操作的提示 要解决此问题,请参阅“处理断开连接”一节。
例如,可能由于连接断开而发生。