我正在使用sqlalchemy核心解析文件并将其插入数据库。我最初设置的是orm,但这并不符合项目的速度要求。
我的数据库有2个表:对象和属性。 Objects表的主键为obj_id。 Attributes的主键是composite: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,名称和类打印到文件中以查找重复键。列表中没有任何地方存在相同的主键,因此这让我相信它是我的查询结构的问题。
任何人都可以用我给出的信息来解决这个问题,或者给我一些地方寻找更多信息?我已经非常彻底地检查了文档,并且找不到任何有用的信息。
我还尝试单独执行每个插入语句,正如sqlalchemy的谷歌小组的人所建议的那样。结果是一样的。我使用的代码:
insert = Attributes.__table__.insert()
for attr in attrList:
stmt = insert.values({'obj_id' : attr['obj_id'], ...})
self.engine.execute(stmt)
其中......是其余的值。
一旦我尝试插入具有相同名称/类但具有不同对象ID的属性,就会抛出完整性错误。例如:
格式为name-class-id:
通过迭代4,我得到了:
在下一次迭代中,我尝试插入失败的Attr1-Class1-1。
答案 0 :(得分:0)
我发现了问题,与插入代码完全无关。当我在列表中存储数据时,我将一个Object存储为obj_id,而sqlalchemy不喜欢它。通过修复我修复插入。