当前位置:Gxlcms > mysql > Python+SQLAlchemy+MySQL出现IntegrityError,Duplicateent

Python+SQLAlchemy+MySQL出现IntegrityError,Duplicateent

时间:2021-07-01 10:21:17 帮助过:19人阅读

今天用SQLAlchemy更新数据库的时候遇到一个Error: Firebug: WebError Traceback: ? IntegrityError: (IntegrityError) (1062, Duplicate entry '14-0' for key 'idx_sid_view') 'INSERT INTO template (schema_id, view, template, update_time) VALUES (%s

今天用SQLAlchemy更新数据库的时候遇到一个Error:

Firebug:

WebError Traceback:
? IntegrityError: (IntegrityError) (1062, "Duplicate entry '14-0' for key 'idx_sid_view'") 'INSERT INTO template (schema_id, view, template, update_time) VALUES (%s, %s, %s, %s)' (14, 0, 'this is a new view message.', None)

Log:

17:21:55,461 INFO [sqlalchemy.engine.base.Engine] [worker 5]BEGIN (implicit)
17:21:55,461 INFO [sqlalchemy.engine.base.Engine] [worker 5] INSERT INTO template (schema_id, view, template, update_time) VALUES (%s, %s, %s, %s)
17:21:55,461 INFO [sqlalchemy.engine.base.Engine] [worker 5] (14, 0, 'this is a new view message.', None)
17:21:55,463 INFO [sqlalchemy.engine.base.Engine] [worker 5] ROLLBACK

由于是更新数据库,所以在Python里面是这样写的:

Session.merge(newtpl)

Session.commit()


怎么找都不知道哪里错了。。。

后来后来仔细想了想,然后去看了下表结构才想明白。原来是这样。

表结构是这样的,


我在更新的时候直插入了schema_id, view, template这3个字段,但是作为主键的id字段没有更新,所以出现了上面的错误。

然后改正就简单了。

把原始表里面的数据的id读出来,更新的时候把id放在要更新的字段,这样就OK了。

类似于下图这样:


现在就成功了,再看看log:

17:52:36,729 INFO [sqlalchemy.engine.base.Engine] [worker 2] BEGIN (implicit)
17:52:36,730 INFO [sqlalchemy.engine.base.Engine] [worker 2] SELECT template.id AS template_id, template.schema_id AS template_schema_id, template.view AS template_view, template.template AS template_template, template.update_time AS template_update_time
FROM template
WHERE template.schema_id = %s AND template.view = %s
LIMIT %s
17:52:36,730 INFO [sqlalchemy.engine.base.Engine] [worker 2] (14, 0, 1)
17:52:36,732 INFO [sqlalchemy.engine.base.Engine] [worker 2] UPDATE template SET template=%s WHERE template.id = %s
17:52:36,732 INFO [sqlalchemy.engine.base.Engine] [worker 2] ('ffffff, this is a merge test.again', 14949L)
17:52:36,734 INFO [sqlalchemy.engine.base.Engine] [worker 2] COMMIT

一些有用的东西:

1、merge的使用:数据库表中存在此记录,主要是用来更新数据表的某个记录。即将表中的数据与源表对比,如果存在记录,则根据源表中的值更新目标表中的数据,如果不存在的话,则新增入目标表中。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

2、SQLAlchemy中对数据库操作常用的几条语句:

Session.query(table)
Session.add(record)
Session.merge(record)
Session.delete(record)
Session.commit()

人气教程排行