В чем причина mysqldb Warning: Усеченная неправильная ошибка DOUBLE?

Я получаю много предупреждений одного и того же типа -

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".

Вот моя функция Python, которая удаляет 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 - это строка, а не двойная. Что мне здесь не хватает?

Большое спасибо.

Изменить

После изменения моей процедуры удаления использовать 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

Ответ 1

Посмотрите на эту строку "where PremiseID = " + str(premiseID) + " ; "])". Сравнение происходит по разным типам, и когда MySQL сравнивает разные типы данных, они бросаются в DOUBLE изнутри перед сравнением. Таким образом, вы можете попробовать разместить одиночную цитату или бросить вокруг, чтобы решить проблему. Так что не пытайтесь поймать, а кавычки, которые разрешают проблему.

Ответ 2

Не сворачивайте свой собственный построитель строк запроса, он вызывает всевозможные проблемы. Используйте встроенный синтаксис построения запроса для вашей библиотеки SQL Python. Если вы используете MySQLdb по крайней мере, вы должны сделать что-то вроде:

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

Ответ 3

Я считаю, что вы забыли кавычки:

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

Но я настоятельно рекомендую вам не выполнять SQL-запросы таким образом, как объяснил @sr2222.