【发布时间】:2015-05-16 04:17:09
【问题描述】:
我正在使用 sqlalchemy 核心解析文件并将其插入数据库。我最初是用 orm 设置的,但这不符合项目的速度要求。
我的数据库有 2 个表:对象和属性。 Objects 表有一个主键 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、名称和类打印到文件中以查找重复键。列表中实际上没有相同的主键,所以这让我相信这是我的查询结构有问题。
谁能用我提供的信息弄清楚这一点,或者给我一个地方寻找更多信息?我已经非常彻底地检查了文档,找不到任何有用的东西。
编辑:
我还尝试按照 sqlalchemy 的 google 组中的某个人的建议分别执行每个插入语句。结果是一样的。我使用的代码:
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,但失败了。
【问题讨论】:
标签: python mysql database sqlalchemy foreign-keys