首页 > 解决方案 > 使用临时表的命令不同步 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

标签: mysqlpyqt5

解决方案


推荐阅读