sqlalchemy 核心完整性错误
sqlalchemy core integrity error
我正在使用 sqlalchemy 核心解析文件并将其插入数据库。本来是用orm设置的,但是不符合项目的速度要求。
我的数据库有 2 个 table:对象和属性。对象 table 的主键为 obj_id。 Attributes 的主键是复合的:attr_name、attr_class 和 obj_id,它也是 Objects 的外键。
解析文件后将属性存储在字典列表中,如下所示:
[
{ 'obj_id' = obj_id, 'attr_name' = name, 'attr_class' = class, etc...},
{ ETC ETC ETC}]
正在插入数据,首先批量插入对象,然后插入属性。对象插入完美无缺。但是,在插入属性时,出现完整性错误,提示我尝试插入重复的主键。
这是我的属性插入代码:
self.engine.execute(
Attributes.__table__.insert(),
[{'obj_id' : attr['obj_id'],
'attr_name' : attr['attr_name'],
'attr_class': attr['attr_class'],
'attr_type' : attr['attr_type'],
'attr_size' : attr['attr_size']} for attr in attrList])
在尝试解决此错误时,我将列表中每个属性的 ID、名称和 class 打印到文件中以查找重复键。列表中实际上没有相同的主键,所以这让我相信这是我的查询结构的问题。
任何人都可以根据我提供的信息解决这个问题,或者给我一个地方来寻找更多信息吗?我已经非常彻底地检查了文档,但找不到任何有用的信息。
编辑:
我还尝试按照 sqlalchemy 的 google 组中某人的建议分别执行每个插入语句。结果是一样的。我使用的代码:
insert = Attributes.__table__.insert()
for attr in attrList:
stmt = insert.values({'obj_id' : attr['obj_id'], ...})
self.engine.execute(stmt)
其中 ... 是其余值。
编辑 2:
当我尝试插入具有相同 name/class 但对象 ID 不同的属性时,会立即引发完整性错误。例如:
格式名称-class-id:
通过第 4 次迭代,我得到:
- Attr1-Class1-0
- Attr2-Class2-0
- Attr3-Class3-0
- Attr4-Class4-0
在下一次迭代中,我尝试插入 Attr1-Class1-1,但失败了。
我发现了问题,与插入代码完全无关。在列表中存储数据时,我将一个对象存储为 obj_id,sqlalchemy 不喜欢它。通过修复我修复了插入。
我正在使用 sqlalchemy 核心解析文件并将其插入数据库。本来是用orm设置的,但是不符合项目的速度要求。
我的数据库有 2 个 table:对象和属性。对象 table 的主键为 obj_id。 Attributes 的主键是复合的:attr_name、attr_class 和 obj_id,它也是 Objects 的外键。
解析文件后将属性存储在字典列表中,如下所示:
[
{ 'obj_id' = obj_id, 'attr_name' = name, 'attr_class' = class, etc...},
{ ETC ETC ETC}]
正在插入数据,首先批量插入对象,然后插入属性。对象插入完美无缺。但是,在插入属性时,出现完整性错误,提示我尝试插入重复的主键。
这是我的属性插入代码:
self.engine.execute(
Attributes.__table__.insert(),
[{'obj_id' : attr['obj_id'],
'attr_name' : attr['attr_name'],
'attr_class': attr['attr_class'],
'attr_type' : attr['attr_type'],
'attr_size' : attr['attr_size']} for attr in attrList])
在尝试解决此错误时,我将列表中每个属性的 ID、名称和 class 打印到文件中以查找重复键。列表中实际上没有相同的主键,所以这让我相信这是我的查询结构的问题。
任何人都可以根据我提供的信息解决这个问题,或者给我一个地方来寻找更多信息吗?我已经非常彻底地检查了文档,但找不到任何有用的信息。
编辑:
我还尝试按照 sqlalchemy 的 google 组中某人的建议分别执行每个插入语句。结果是一样的。我使用的代码:
insert = Attributes.__table__.insert()
for attr in attrList:
stmt = insert.values({'obj_id' : attr['obj_id'], ...})
self.engine.execute(stmt)
其中 ... 是其余值。
编辑 2:
当我尝试插入具有相同 name/class 但对象 ID 不同的属性时,会立即引发完整性错误。例如:
格式名称-class-id:
通过第 4 次迭代,我得到:
- Attr1-Class1-0
- Attr2-Class2-0
- Attr3-Class3-0
- Attr4-Class4-0
在下一次迭代中,我尝试插入 Attr1-Class1-1,但失败了。
我发现了问题,与插入代码完全无关。在列表中存储数据时,我将一个对象存储为 obj_id,sqlalchemy 不喜欢它。通过修复我修复了插入。