PySide6:数据库插入成功后如何清空QPlainTextEdit与QComboBox?
解决PySide6批量插入数据库后仅成功才清空控件的问题
核心思路
利用数据库事务机制,将所有插入操作作为一个整体执行:
- 所有数据插入完成后统一提交事务
- 通过
try-except捕获异常,失败时回滚事务,不执行清空操作 - 仅当全部插入成功并提交后,才执行控件清空逻辑
修改后的代码
def commit(self): self.inserebd() tree_data = self.dadostree() self.contarserie() sql = """INSERT INTO "Teste"("DataEntrada","Código de Barras","Numero de serie","Categoria","Marcasss","Modelo","Fornecedores","Estado","Projeto","Valor/Uni","Quantidade") VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""" try: # 循环执行所有插入操作,但暂不提交 for paren_data, children_data in tree_data: codigo_barras = paren_data if not children_data: dados = (self.data, codigo_barras, 'No', self.idC, self.id, self.modelo, self.idf, self.estado, self.projeto, self.valor, self.quantidade) cursor.execute(sql, dados) # 所有插入成功后,统一提交事务 con.commit() QtWidgets.QMessageBox.information(self, "Sucesso", f" {self.total_serie} Produtos Inseridos") # 仅在提交成功后执行控件清空 self.ui.treeWidget.clear() self.ui.textmodelo.clear() self.ui.textEdit.clear() self.ui.textEdit_Data.clear() self.ui.textEdit_Preco.clear() self.dodo = [] self.ui.comboBox.setCurrentIndex(self.default_item_index) self.ui.comboBox_Marca.setCurrentIndex(self.default_item_index) except Exception as e: # 插入失败时回滚事务,保留输入数据 con.rollback() QtWidgets.QMessageBox.critical(self, "Erro", f"插入失败: {str(e)}")
关键改动说明
- 事务统一提交:把
con.commit()从循环内移到循环结束后,确保所有数据都插入成功才提交,避免出现部分数据插入成功的不一致情况 - 异常捕获与回滚:用
try-except包裹整个插入流程,捕获数据库操作异常,失败时执行con.rollback()回滚事务,保证数据完整性 - 清空逻辑位置:将控件清空代码放在
con.commit()之后、try块内部,确保只有全部数据插入成功才执行清空操作 - 提示框优化:将成功提示移到循环外,避免插入多条数据时重复弹出提示框
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

