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で多くの行を削除したい。特にここに1つあります:「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は文字列であり、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
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 に答える