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中对数据库操作常用的几条语句:
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()
相关文章推荐
- MySql出现ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
- MySQL --- SQL Error: 1062: Duplicate entry '2147483647' for key 'PRIMARY'
- _mysql_exceptions.IntegrityError: (1062, "Duplicate entry, Python操作MySQL数据库,插入重复数据
- ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
- _mysql_exceptions.IntegrityError: (1062, "Duplicate entry, Python操作MySQL数据库,插入重复数据
- Last_Errno: 1062,Last_Error: Error 'Duplicate entry '...' for key 'PRIMARY'' on query. 的详细分析过程
- ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
- centos7 安装mysql--python模块出现EnvironmentError: mysql_config not found和error: command 'gcc' failed with exit status 1
- MySQLIntegrityConstraintViolationException: Duplicate entry '***' for key 'PRIMARY'
- ERROR 1062 (23000) at line 1: Duplicate entry '1332883220' for key 'group_key'
- Duplicate entry '1000094731-2' for key 'PRIMARY', Error_code: 1062;
- mysql "email"字段 的属性项没有设置成UNSIGNED,但是添加'0'到email字段报错:#1062 –Duplicate entry '1' for key 'email',求解
- 安装MySQL-python-1.2.3c1出现“error: command 'gcc' failed with exit status 1”错误
- mysql出现Duplicate entry '0' for key 'PRIMARY'的错误
- ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
- mysql主从库同步错误:1062 Error 'Duplicate entry '1438019'
- mysql #1062 –Duplicate entry '1' for key 'PRIMARY'
- ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
- Magento报错之SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry for key 1
- mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'