mysqldb警告的原因是什么:截断错误的DOUBLE值错误?

时间:2012-08-02 15:22:39

标签: python mysql-python

我收到了很多同样的警告 -

Warning: Truncated incorrect DOUBLE value: '512121500B'

- 但无法弄清楚原因。

MySQL表dr_snapshot如下所示:

PremiseID char(10) Primary Key
cycle SMALLINT(6)
last_read DATETIME
reading INTEGER
DeviceID INTEGER

我想通过PremiseID删除很多行。这是一个特别的:'512121500B'。

这是我的功能,由PremiseID删除:

def delDrSnapRow(premiseID, db):
    sql_cmd = " ".join([
        "delete ",
        "from dr_snapshot ",
        "where PremiseID = " + str(premiseID) + " ; "])

    del_cur = db.cursor()
    rc = del_cur.execute(sql_cmd)
    del_cur.close()

    return rc

PremiseID是一个字符串,而不是double。我在这里缺少什么?

非常感谢。

修改

修改我的删除程序后使用try:..除外,我没有看到警告。我相信我没有看到警告,因为我没有看到警告显示 - print(e) - 在除了部分。

我得到的结论是:尝试:除了以某种方式删除了错误。

def delDrSnapRow(premiseID, db):
    sql_cmd = " ".join([
        "delete ",
        "from dr_snapshot ",
        "where PremiseID = " + "'" + premiseID + "' ; "])

    del_cur = db.cursor()

    try:
        rc = del_cur.execute(sql_cmd)

    except MySQLdb.Error, e:
        print "Error %d: %s" % (e.args[0], e.args[1])

    except MySQLdb.Warning, e:
        print(e)
        rc = del_cur.execute(sql_cmd)

    del_cur.close()

    return rc

3 个答案:

答案 0 :(得分:15)

请看这一行"where PremiseID = " + str(premiseID) + " ; "])"。比较发生在不同的类型上,当MySQL比较不同的数据类型时,它们会在比较之前内部转换为DOUBLE。因此,您可以尝试单独引用或围绕解决问题。所以这不是尝试捕获而是解决问题的报价。

答案 1 :(得分:6)

不要滚动自己的查询字符串构建器,它会导致各种问题。使用Python SQL库的内置查询构造语法。如果您至少使用MySQLdb,您应该能够执行以下操作:

rc = del_cur.execute('delete from dr_snapshot where PremiseID = %s', (premiseID,))

答案 2 :(得分:2)

我相信你忘了引号:

sql_cmd = " ".join([
        "delete ",
        "from dr_snapshot ",
        "where PremiseID = '" + premiseID + "' ; "])

但我强烈建议你不要以这种方式执行sql语句,正如@ sr2222所解释的那样。