【问题标题】:pymysql transaction saves one insert query but ignores two update queries without raising an errorpymysql事务保存一个插入查询但忽略两个更新查询而不引发错误
【发布时间】:2020-01-14 20:28:48
【问题描述】:

基本上,我正在尝试使用 pymysql 事务设置 PyQt5 表单的保存方法。保存意味着对新记录的一次插入查询,以及作为插入结果的两次更新。该方法运行顺利,但要更新的两个表保持不变。没有引发错误,插入确实有效。

最初你尝试使用 SqlDatabase 来建立交易,但我无法建立它。似乎需要为 MySQL 开发一个驱动程序,或者可能已经有一个但找不到它。任何有关这方面的建议将不胜感激。

def saveAndClose(self):
    """Requires to:
    - Save (Insert) new record in mortality table.
    - Update agreementhorses table - (active = False)
    - Update horses table - (active = False).
    - Refresh the dockMortality query in the main form.
    - Refresh this form horse query.
    """
    try:
         cnn = pymysql.connect(**self.con_string)
         cnn.begin()
         with cnn.cursor() as cur:
             sql_mortality = """ INSERT INTO mortality
                 (dod, agreementhorseid, causeid, diagnose, veterinaryid, 
                  notes)
                 VALUES (%s, %s, %s, %s, %s, %s)"""
             self.comboVet.setModelColumn(0)
             self.comboCause.setModelColumn(0)
             parameters = (self.dateOfDeath.date.toString('yyyy-MM-dd'),
                           self.record.value(8),
                           self.comboCause.currentText(),
                           self.lineDiagnosis.text(),
                           self.comboVet.currentText(),
                           self.textNotes.toPlainText())
             cur.execute(sql_mortality, parameters)
             sql_horses = """ UPDATE horses 
                 SET active = False
                 WHERE id = %s"""
             cur.execute(sql_horses, (self.record.value(8)),)
             sql_agreementhorses = """ UPDATE agreementhorses
                 SET active = False 
                 WHERE id = %s"""
             cur.execute(sql_agreementhorses, (self.record.value(9),))
             cnn.commit()
    except pymysql.Error as e:
        QMessageBox.Warning("saveAndClose", (type(e).__name__, e.args))
        cnn.rollback()
    except AttributeError as err:
        print(err.args)
        cnn.rollback()
    except Exception as err:
        print(type(err).__name__, err.args)
        cnn.rollback()
    finally:
        self.comboVet.setModelColumn(1)
        self.comboCause.setModelColumn(1)
        """Resets the  active horses list for this particular agreement"""
        self.tableHorses.model().setQuery(self.getHorsesQuery())
        """Resets the mortality list for this particular agreement on
           the main form subform"""          

        self.parent.tableMortality.model().\
            setQuery(self.parent.queryMortality())
        """Clear the form for the next record to be entered"""
        self.clearForm()

我希望事务能够正确执行,插入一个表并更新另外两个表。同时,我将尝试与 MySql.connector 建立事务作为新尝试。

【问题讨论】:

    标签: python mysql python-3.x pymysql


    【解决方案1】:

    交易运行良好。我在放置更新查询的参数时犯了一个错误。我将第一个查询作为第二个查询作为参数,反之亦然。我花了一些时间来弄清楚这一点。我向所有试图找出我不存在的问题的人道歉。简而言之,“self.record.value(8)”应该是“self.record.value(9)”,反之亦然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多