1

Tornado にこの python コードがあります。

if not usr:
    self.lock_tables("write", ['devices_permissions'])
        self.db.execute("INSERT devices_permissions SET user_id=%s, network_id=%s, device_id=%s, perm=%s",
                         usrid, netid, sensid, perm)
        self.unlock_tables();

    else:

      if perm == 0:
        self.lock_tables("write", ['devices_permissions'])
        self.db.execute("DELETE FROM devices_permissions \
                         WHERE user_id=%s AND device_id=%s", usrid, sensid)
        self.unlock_tables();


      else:
        self.lock_tables("write", ['devices_permissions'])
        self.db.execute("UPDATE devices_permissions SET perm=%s \
                         WHERE user_id=%s AND device_id=%s", perm, usrid, sensid)
        self.unlock_tables();

2 番目のif...elseステートメントに問題があります。私のプログラムは最初のelseブロックに入りますが、2番目のif...elseではif perm == 0ステートメントが機能しないようです。perm変数を出力しましたが、その値は 0 です。そのため、どこでエラーが発生するのかわかりません。

このif...elseステートメントが必要なのは、デバイスに対する権限がなくなったユーザーを DB から削除したいからです。

permは値 0 または 1 の変数です。usrはユーザーのリストです。どうもありがとうございました。

編集

私は次のようにステートメントを変更します。

# Check whether the user has already priviledges on the device
    self.lock_tables("read", ['devices_permissions'])
    usr = self.db.get("SELECT device_id, user_id FROM devices_permissions \
                              WHERE user_id=%s AND device_id=%s", usrid, sensid)
    self.unlock_tables();

    if not usr:
    self.lock_tables("write", ['devices_permissions'])
        self.db.execute("INSERT devices_permissions SET user_id=%s, network_id=%s, device_id=%s, perm=%s",
                         usrid, netid, sensid, perm)
        self.unlock_tables();

    elif perm == 0:
        self.lock_tables("write", ['devices_permissions'])
        self.db.execute("DELETE FROM devices_permissions \
                         WHERE user_id=%s AND device_id=%s", usrid, sensid)
        self.unlock_tables();          

    else:
        self.lock_tables("write", ['devices_permissions'])
        self.db.execute("UPDATE devices_permissions SET perm=%s \
                         WHERE user_id=%s AND device_id=%s", perm, usrid, sensid)
        self.unlock_tables();

そして、いくつかのテストの後、usrリストが空でない場合でも、プログラムは常にif not usrステートメントに入ると思います。どうしたの?

4

1 に答える 1

1

整数のゼロではなく文字列のゼロでpermはないでしょうか? その場合、テストは失敗します。この質問には、print ステートメントで答えることができます。perm == 0

print type(perm)

それが印刷される場合、それは<type 'str'>あなたの問題です。

于 2012-10-17T16:21:29.723 に答える