【问题标题】:sqlalchemy core integrity errorsqlalchemy 核心完整性错误
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 请注意,并不是“sqlalchemy 不喜欢”您发送的内容 - sqlalchemy 本身只是将值直接传递给底层数据库驱动程序。 MySQL 因在插入值时默默地转换值而臭名昭著,而不是在给定错误类型的值时发出错误信号。我很想知道当您发送非整数时它在 obj_id 列中插入了什么。
    • 非常有趣!很高兴知道继续前进……老实说,我对 sqlalchemy/MySQL 还很陌生,所以我不知道如何检查要插入的值。似乎在将 Object 转换为整数时,它只是变成了 0,因为这就是前 ~9 个条目的 obj_id 的内容,以及在接下来的插入中尝试的内容。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2015-06-09
    • 2012-07-04
    • 2018-06-08
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多