我有这个方法:
def get_sftp_connection(self, log_error=True):
self.ensure_one()
login = self.login_id
LogCustom = self.env['log.custom']
try:
transport = Transport((login.host, login.port))
transport.connect(username=login.user, password=login.passwd)
sftp = SFTPClient.from_transport(transport)
except socket.gaierror:
msg = _("Name or service '%s' not known") % (login.host)
if log_error:
LogCustom.log_error_event(operation='read', ref=self._get_rec_description(), name=msg)
raise ValidationError(msg)
return sftp
如果发生异常,我想在数据库中创建日志记录。但是python / psycopg2似乎回滚了任何更改,因为异常。当我检查是否在raise
发生之前创建了日志。它是,但在提高之后,所有东西都会被回滚。
是否可以raise
并同时创建登录数据库?就像在一些不同的事务中包装日志创建一样(所以它会避免回滚)
答案 0 :(得分:0)
如果选中了logging选项,我选择跳过raise,那么我就可以在数据库中创建日志了。虽然我不得不调整代码以期望可以从此方法返回None
。
这实际上是一种解决方法。如果有更好的完整证明/安全解决方案,请将其作为答案发布。
def get_sftp_connection(self, log_error=True):
self.ensure_one()
login = self.login_id
LogCustom = self.env['log.custom']
ref = self._get_rec_description()
try:
transport = Transport((login.host, login.port))
transport.connect(username=login.user, password=login.passwd)
sftp = SFTPClient.from_transport(transport)
except socket.gaierror:
msg = _("Name or service '%s' not known") % (login.host)
if log_error:
LogCustom.log_warning_event(operation='read', ref=ref, name=msg)
return None
else:
raise ValidationError(msg)
return sftp