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-1,但失败了。

我发现了问题,与插入代码完全无关。在列表中存储数据时,我将一个对象存储为 obj_id,sqlalchemy 不喜欢它。通过修复我修复了插入。