PyQt5使用QDateTime插入MySQL timestamp(6)报Error 1292错误求解决
解决MySQL Error 1292: Incorrect datetime value 问题
你遇到的核心问题是直接将PyQt的QDateTime/QDate对象传入MySQL查询,MySQLdb无法自动把这些对象转换成timestamp(6)或date字段要求的格式。我们需要手动把Qt日期时间对象转成MySQL支持的字符串格式,同时修正代码里的其他小问题。
关键修改点
- 针对
timestamp(6)类型的inv_date字段:要转换成带6位微秒的日期时间字符串,格式为yyyy-MM-dd hh:mm:ss.zzzzzz - 针对
date类型的inv_expiry、inv_due_date字段:转换成yyyy-MM-dd格式的字符串 - 修正文本框和组合框的取值错误:
QTextEdit需用toPlainText()获取文本,组合框若要存选项文本而非索引,要用currentText()
修改后的click_save方法代码
@pyqtSlot() def click_save(self): con = mdb.connect(user='root', passwd='ilovemy1god', host='localhost', database='A3A_SIS') with con: cur = con.cursor() # 转换Qt日期时间对象为MySQL支持的字符串格式 inv_date_str = self.dt_inv_datetime.dateTime().toString("yyyy-MM-dd hh:mm:ss.zzzzzz") inv_expiry_str = self.de_inv_expiry.date().toString("yyyy-MM-dd") inv_duedate_str = self.de_inv_duedate.date().toString("yyyy-MM-dd") # 获取正确的文本和选项值 item_desc = self.te_inv_itemdesc.toPlainText() prod_name = self.cb_inv_prodname.currentText() pay_terms = self.cb_inv_terms.currentText() inv_status = self.cb_inv_status.currentText() cur.execute('''INSERT INTO inv_delivery(inv_date, inv_invoice_num, inv_sup_name, inv_prod_name, inv_prod_itemdesc, inv_batchnum, inv_expiry, inv_quantity, inv_list_price, inv_discount, inv_net_price, inv_total_amount, inv_pay_terms, inv_due_date, inv_status) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)''', ( inv_date_str, self.le_inv_invnum.text(), self.le_inv_supplier.text(), prod_name, item_desc, self.le_inv_batch.text(), inv_expiry_str, self.le_inv_quantity.text(), self.le_inv_listprice.text(), self.le_inv_discount.text(), self.le_inv_netprice.text(), self.le_inv_totalamount.text(), pay_terms, inv_duedate_str, inv_status ) ) cur.close() QMessageBox.information(self, "Connection", "Data Inserted Successfully") # 重置表单(保留你原有的逻辑) self.dt_inv_datetime.setDateTime(QtCore.QDateTime.currentDateTime()) self.le_inv_invnum.setText('') self.le_inv_supplier.setText('') self.cb_inv_prodname.setItemText(0,'Eprex 4kiu') self.te_inv_itemdesc.setText('') self.le_inv_batch.setText('') self.de_inv_expiry.setDate(QtCore.QDate.currentDate()) self.le_inv_quantity.setText('') self.le_inv_listprice.setText('') self.le_inv_discount.setText('') self.le_inv_netprice.setText('') self.le_inv_totalamount.setText('') self.cb_inv_terms.setItemText(0,'COD') self.de_inv_duedate.setDate(QtCore.QDate.currentDate()) self.cb_inv_status.setItemText(0,'Fully Paid') self.initWindow()
详细说明
日期时间格式适配:
QDateTime.toString("yyyy-MM-dd hh:mm:ss.zzzzzz")生成的字符串完美匹配MySQLtimestamp(6)的格式,包含6位微秒,完全符合字段要求。QDate.toString("yyyy-MM-dd")生成标准日期字符串,适配MySQL的date类型字段。
其他取值修正:
self.te_inv_itemdesc.document()返回的是QTextDocument对象而非文本内容,改用toPlainText()才能获取到输入的纯文本。- 原来的
currentIndex()会把组合框的选项索引(数字)存入数据库,如果你的inv_prod_name等字段是文本类型,用currentText()获取选项的显示文本,才能保证存入的数据符合业务预期。
这样修改后,就能彻底解决Error 1292的格式错误,同时保证所有字段的数据类型正确匹配。
内容的提问来源于stack exchange,提问作者Anthony Gaupo
相关产品推荐
相关产品推荐

