IntegrityError当事务存在数据完整性问题时,SQLAlchemy 似乎只会抛出一般错误。当然,确切的查询和错误消息包含在异常中,这足以供人调试程序。然而,在为异常编写错误处理代码时,据我所知,似乎没有一个好的方法来检查哪个表上的哪个约束导致了错误。另外,异常是由该session.commit()行引发的,而不是由实际负责产生错误的行引发的,因此我也无法使用多个 try/ except 块来区分。
有没有一种方法,除了尝试以编程方式解析错误消息和/或查询之外,我可以将重复的主键错误与外键错误或失败的 CHECK 约束等区分开来?或者甚至只是一种判断哪个表的哪一列违反了数据完整性的方法?或者只是一种在导致错误的行上立即引发异常而不是等待事务提交的方法?
我正在使用 Python、Flask、MySQL 和 uWSGI 开发基于 Web 的应用程序。但是,我没有使用 SQL Alchemy 或任何其他 ORM。我正在使用来自旧 PHP 应用程序的预先存在的数据库,该数据库无论如何都不能很好地与 ORM 配合使用,所以我只是mysql-connector手动使用和编写查询。
该应用程序在我第一次启动时运行正常,但是当我第二天早上回来时,我发现它已经坏了。我会收到类似mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query或类似的错误mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '10.0.0.25:3306', system error: 32 Broken pipe。
我一直在研究它,我想我知道问题是什么。我只是一直无法找到一个好的解决方案。尽我所能,问题在于我保留了对数据库连接的全局引用,并且由于 Flask 应用程序始终在服务器上运行,因此该连接最终会过期并变得无效。
我想为每个查询创建一个新连接就足够简单了,但这似乎远非理想的解决方案。我想我还可以构建某种连接缓存机制,它会在一小时左右后关闭旧连接,然后重新打开它。这是我能想到的最好的选择,但我仍然觉得应该有更好的选择。
我环顾四周,大多数收到这些错误的人都有巨大的或损坏的表,或者类似的东西。这里情况不同。旧的 PHP 应用程序仍然运行良好,表的行数都少于 50,000 行,列数少于 30,Python 应用程序运行良好,直到它停顿了大约一天。
所以,这里希望有人有一个很好的解决方案来保持与 MySQL 数据库的持续打开连接。或者,也许我完全在错误的树上吠叫,如果是的话,希望有人知道。
我正在AngularDart中构建一个应用程序,到目前为止一切顺利。我特别喜欢它使表格变得如此容易。但是,我在这方面遇到了一些障碍。
基本上,我想做的是让给定表单元素的ngModel处理不同的数据类型,并根据需要在两者之间来回转换。例如,我<input type='number'/>在HTML中使用一个元素,但在dart业务逻辑方面,我想将该值作为Dart Decimal类处理(来自此处:https://pub.dartlang.org/packages/小数)),因为我需要避免浮点问题。
我在我的应用程序中大量使用了2路数据绑定和ngModel,因为它很棒并且可以很好地在此应用程序中使用。但是,ngModel在此特定情况下不起作用。显然,我可以解决这个问题,但是我希望有更多的优雅。我希望能够指定一些类或函数,使我可以使用ngModel进行类型转换。
我在Google和文档中四处浏览,怀疑我的解决方案与使用Form Control有关,尽管我对这到底是如何工作有些困惑。我很难找到与我想做的事情相关的示例代码或文档。也许我在那儿树错了树。
这是一个超级简化的示例,说明如果我能确定自己需要做什么,可以完成的工作:
@Component(
selector: 'my-component',
template: '...<input type="number" [(ngModel)]="thing.attr"/>...'
)
class MyComponent{
DataObject thing = new DataObject();
}
class DataObject{
Decimal attr;
}
Run Code Online (Sandbox Code Playgroud)
我想这是我可能会遇到的很多事情,需要进行类型转换,而不仅仅是在这种情况下专门针对Decimal类,因此任何人的任何帮助或建议都将不胜感激。
根据以下Ted Sander的回答,我可以取得一些不错的进步,但是它对我来说还不是很有效,我不确定为什么。
这是我最终得到的代码:
import 'package:angular/angular.dart';
import 'dart:html';
import 'package:angular_forms/angular_forms.dart';
import 'package:decimal/decimal.dart';
@Directive(
selector: 'input[type=decimal][ngControl],'
'input[type=decimal][ngFormControl],'
'input[type=decimal][ngModel]',
)
class DecimalValueAccessor implements ControlValueAccessor {
final InputElement _element;
DecimalValueAccessor(HtmlElement element) : _element = element as InputElement;
@HostListener('change', ['\$event.target.value'])
@HostListener('input', ['\$event.target.value'])
void handleChange(String value) …Run Code Online (Sandbox Code Playgroud)