Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy IntegrityError违反了约束名称_Python_Sqlite_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy IntegrityError违反了约束名称

Python SQLAlchemy IntegrityError违反了约束名称,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我对数据库表的列有很多不同的约束。插入数据库的数据通常包含数字数组(设置了这些数字的约束条件),例如(DDL的一部分): 创建表“对象”( id整数不为空, 主键(id), 外键(id)引用“通用”(id)//继承 ); 创建表“ObjectData”( id整数不为空, x浮点不为空, y浮点不为空, d浮点不为空, 浮点数不为空, e FLOAT不为空, 对象id整数不为空, 主键(id), 约束“重复x,y值”唯一(x,y,对象id), 约束“x必须>=-1.0”检查(x>=0.0), 约

我对数据库表的列有很多不同的约束。插入数据库的数据通常包含数字数组(设置了这些数字的约束条件),例如(DDL的一部分):

创建表“对象”(
id整数不为空,
主键(id),
外键(id)引用“通用”(id)//继承
);
创建表“ObjectData”(
id整数不为空,
x浮点不为空,
y浮点不为空,
d浮点不为空,
浮点数不为空,
e FLOAT不为空,
对象id整数不为空,
主键(id),
约束“重复x,y值”唯一(x,y,对象id),
约束“x必须>=-1.0”检查(x>=0.0),
约束“x必须为=-1.0”检查(y>=-1.0),
约束“y必须为=-1.0”检查(d>=0.0),
约束“d必须为=-270.0”检查(a>=-270.0),
约束“a必须为=-1.0”检查(e>=-1.0),

约束“e必须我已经发现SQLAlchemy库的使用有什么问题。当我在调试模式下运行软件时,在引发IntegrityError异常时中断(中断点在SQLAlchemy库的DBAPIError.instance方法中设置)然后我意识到最初的错误类型是类“pysqlite2.\u sqlite.error”而不是sqlite3。似乎在我的Python环境中安装了站点包库中的pysqlite2,但这与sqlite3不同。我尝试使用简单的解决方法:从站点包中删除pysqlite2目录。在原始异常类型之后Been类'sqlite3.Error'和异常中的orig.message正好包含我所期望的内容。因此很明显,SQLAlchemy默认使用pysqlite2库,而不是内置的sqlite3库。

通常,我在ORM层强制约束,因为它更容易处理(也更容易更改)。这是您的选项吗?否则,您可以使用SQLAlchemy反射映射表和表约束,并可能获得更好的结果。感谢您的回答。在ORM层强制约束的问题是SQLite3 DB是本地文件,不仅可以更改我的软件。因为所有对象都没有加载到rom DB在启动时,当程序在其中一个选项卡上显示警告框时,用户会感到非常奇怪,而且目前我无法建议处理所述情况的明显方法。在DB处检查约束似乎更可靠。因此,您能提供关于第二个选项的更多信息吗(我不太明白如何实现它)。我看到你让它工作了,我很高兴。SQLAlchemy中的反射非常复杂,但基本上你可以将它指向一个表,并自动提取关于它的所有元数据(表、列和约束),然后用它来运行查询。这不适合胆小的人。