Команды не синхронизированы c MySql PyQt5 с использованием временных таблиц - PullRequest
0 голосов
/ 24 апреля 2020

Основная программа основана на клиенте PyQt5 и хранит информацию в БД MySql. Проблема заключается в том, что мне нужно импортировать данные из базы данных MS Access (выполняемой QSqlQuery с использованием QODB C) в запросе (qryImport). Я установил временную таблицу, используя новое соединение (self.tempDb) для передачи информации в MySQL, и я некоторое время запускаю процедуру сохранения l oop, чтобы вставить данные в MySql по одной записи за раз , Проблема заключается в том, что мы получаем печально известную ошибку «команды из syn c ...» при запуске второго цикла while или в режиме отладки (PyCharm), как только я ускоряю процесс. Не удалось найти ответ на проблему через net, но в форме "Команды не в порядке * c" справочного руководства MySql https://dev.mysql.com/doc/refman/8.0/en/commands-out-of-sync.html, которое в моем случае не очень помогло. Я также пытаюсь закрыть соединение, открыть соединение и очистить запрос после выполнения каждого цикла, который решает проблему несинхронизации c, но удаляет временные таблицы в соединении в обоих случаях, кроме того, что он не очень эффективен. Большая часть информации, которую я нашел об этом, относится либо к MSQLDB * PHP, либо к python, поэтому я не смог выполнить рекомендации руководства по использованию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...