Heim > Datenbank > MySQL-Tutorial > Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

WBOY
Freigeben: 2016-06-07 15:41:15
Original
1459 Leute haben es durchsucht

今天用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()

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

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

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

表结构是这样的,

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

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

然后改正就简单了。

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

类似于下图这样:

Python + SQLAlchemy + MySQL出现IntegrityError, Duplicate ent

现在就成功了,再看看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()
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage