Основная программа основана на клиенте 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