跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

今天用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 INTOtemplate (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) 立即学习 “ Python免费学习笔记(深入) ”; 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]SELECTtemplate.idAS 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_timeFROM templateWHERE template.schema_id = %s AND template.view = %sLIMIT %s17:52:36,730 INFO  [sqlalchemy.engine.base.Engine] [worker 2] (14, 0, 1)17:52:36,732 INFO  [sqlalchemy.engine.base.Engine] [worker 2]UPDATEtemplate SET template=%s WHERE template.id = %s17: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()

相关文章