您的位置:首页 > 编程语言 > Python开发

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate entry - 1062

2013-08-13 18:09 645 查看
今天用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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐