19

我收到许多相同类型的警告——

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 删除的 Python 函数:

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 是一个字符串,而不是双精度。我在这里想念什么?

非常感谢。

编辑

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

我得出的结论是 try: except 以某种方式消除了错误。

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
4

3 回答 3

22

看看这条线"where PremiseID = " + str(premiseID) + " ; "])"。比较发生在不同的类型上,当 MySQL 比较不同的数据类型时,它们在比较之前在内部被强制转换为 DOUBLE。因此,您可以尝试使用单引号或强制转换来解决问题。所以解决问题的不是try catch,而是引号。

于 2012-08-02T16:31:09.803 回答
6

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

rc = del_cur.execute('delete from dr_snapshot where PremiseID = %s', (premiseID,))
于 2012-08-02T15:36:57.923 回答
3

我相信你忘记了引号:

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

但我强烈建议您不要像@sr2222 解释的那样以这种方式执行 sql 语句。

于 2012-08-02T16:30:53.597 回答