mysql - 使用临时表的命令不同步 MySql PyQt5
问题描述
主程序基于 PyQt5 客户端并将信息存储在 MySql DB 上。问题是我需要从 MS Access DB 中导入数据(由 QSqlQuery 使用 QODBC 完成)加载到查询中(qryImport)。我使用新连接(self.tempDb)设置了一个临时表以将信息传输到 MySQL,并且我在 while 循环上运行存储过程,以一次将数据插入 MySql 一条记录。问题是,在运行第二个 while 循环或在调试模式 (PyCharm) 下,只要我加快进程,就会出现臭名昭著的“命令不同步……”错误。无法通过网络找到问题的答案,但 MySql 参考手册https://dev.mysql.com/doc/refman/8.0/en/commands-out-of-sync的“命令不同步”形式.html就我而言,这不是很有帮助。我还尝试关闭连接并打开连接并在执行每个周期后清除查询,这会解决不同步问题,但在两种情况下都会删除连接上的临时表,而且效率不高。我发现的关于它的大部分信息都是指 PHP 或 python 的 MSQLDB,所以我无法实施手册中关于使用 msql_free_result() 或 msql_store_result() 的建议,因为我不知道该怎么做。对于解决此问题的任何建议,我将不胜感激。同时,我将尝试使用永久表作为解决方法 - 我不喜欢 - 或者最终将查询从 MS Access 导出到 MySql。
# ............................................
qryImport.seek(-1)
qry = QSqlQuery(self.tempDb)
qry.prepare("CALL importhorses_loaddata(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
while qryImport.next():
qry.addBindValue(QVariant(qryImport.value(0))) # accessid
qry.addBindValue(QVariant(qryImport.value(1))) # name
qry.addBindValue(QVariant(qryImport.value(2))) #rp
qry.addBindValue(QVariant(qryImport.value(3).toString("yyyy-MM-dd"))) #BirthDate
qry.addBindValue(QVariant(qryImport.value(4))) #sexid
qry.addBindValue(QVariant(qryImport.value(5))) #coatid
qry.addBindValue(QVariant(qryImport.value(6))) #isbreakable
qry.addBindValue(QVariant(qryImport.value(7))) #isBroke
qry.addBindValue(QVariant(qryImport.value(8))) #isPlayer
qry.addBindValue(QVariant(qryImport.value(9))) #Father
qry.addBindValue(QVariant(qryImport.value(10))) #Mother
qry.addBindValue(QVariant(qryImport.value(11))) #UbicacionID
qry.addBindValue(QVariant(self.importDate.date().toString("yyyy-MM-dd"))) #ImportDate
qry.exec()
if qry.lastError().type() != 0:
raise DataError("importHorses", qry.lastError().text())
if qry.first():
print(qry.value(0))
# .....................................```
存储过程:
CREATE PROCEDURE importhorses_loaddate(IN p_accessid INT,........., IN p_inputdate DATE)
BEGIN
DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE _horsebaseid INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
SELECT code, msg;
ROLLBACK;
END;
START TRANSACTION;
SELECT horsebaseid FROM horses WHERE horsebaseid = p:accessid INTO _horsebaseid;
IF _horsebaseid != p_accessid THEN
INSERT INTO importedhorses(horsebaseid, ..........., inputdate)
VALUES(p_accessid, ......................, p_inputdate);
END IF;
COMMIT;
END
解决方案
推荐阅读
- javascript - 如何从 href 属性获取宽度和高度
- php - PDO 没有将 MS Access DB 的输出发送到 php
- mongodb - MongoDB多组聚合
- php - AuthnetWebhook 包签名密钥验证
- json - 如何在 Sql server 中替换 JSON 对象中的完整对象
- javascript - 如何为 Canvas 上动态添加的形状添加动态标签?
- python - Python:如何在文件中每秒打印 datetime.datetime.now()?
- java - 如何将通话记录中的号码填充到 onClick 列表中?
- python - 在 Python 中调用 URL 时出错
- angular - 前提是 Pipe 无权访问路由解析的数据