sqlalchemy核心完整性错误

时间:2015-03-13 15:37:58

标签: python mysql database sqlalchemy foreign-keys

我正在使用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) 

其中......是其余的值。

编辑2:

一旦我尝试插入具有相同名称/类但具有不同对象ID的属性,就会抛出完整性错误。例如:

格式为name-class-id:

通过迭代4,我得到了:

  • ATTR1-Class1-0
  • ATTR2-Class2-0
  • Attr3-Class3-0
  • Attr4-Class4-0

在下一次迭代中,我尝试插入失败的Attr1-Class1-1。

1 个答案:

答案 0 :(得分:0)

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