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 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()

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

Laravel適合團隊熟悉PHP且需功能豐富的項目,Python框架則視項目需求而定。 1.Laravel提供優雅語法和豐富功能,適合需要快速開發和靈活性的項目。 2.Django適合複雜應用,因其“電池包含”理念。 3.Flask適用於快速原型和小型項目,提供極大靈活性。

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。
