2

単純なクエリを実行しようとしているデータストアで作業していますが、想定どおりに機能しません。

class User_Machine(db.Model):
    machine_id = db.IntegerProperty (required = True)
    username = db.StringProperty (required = True)
    last_call = db.DateTimeProperty (auto_now = True)

def query(username, machine_id)
    q = db.GqlQuery('SELECT * FROM User_Machine WHERE username=:1 AND machine_id=:2', username, machine_id)
    r = q.get()
    return r

print query('uherran', 23)

そして私の応答は次のとおりです。

なし

そして、私はこの記録を読むことを期待していました:

datastopreビューアの値は次のとおりです。

Enitty Kind  User_Machine
Entity Key   ahBkZXZ-Z2VzdG9yYXZpc29zchILEgxVc2VyX01hY2hpbmUYKAw
ID   40
username (string)   uherran
last_call (datetime)    2012-08-19 09:57:35
machine_id (long)       23

クエリがどのように行われるかについての私の理解には、完全に間違っていることがあるに違いありません。

誰でも助けることができますか?

ありがとう。

実際には。わかりやすくするためにコードを少し変更しましたが、適切なエラーチェックを行わなかったようです。

コードは次のとおりです。

def check_machine_username(self, machine_id, username):
        key='CHECK_MACHINE_USERNAME_'+machine_id+'_'+username
        q= memcache.get(key)
        if q:
            return True
        else:
            logging.info(username)
            logging.info(machine_id)
            q = dbstructure.User_Machine.all()
            q.filter('username = ', username)
            q.filter('machine_id = ', machine_id)

            if q.get():
                loggin.info('query right')
                memcache.set(key,True)
                return True
            else:
                logging.info('query wrong')
                return False

User_machineデータベースに何があっても、そのクエリは常に空を返します。

4

3 に答える 3

1

私の推測では、失敗した場合、machine_idは文字列ですが、intである必要があります。

于 2012-08-19T20:42:39.190 に答える
1

私が気付いた問題は、それmachine_idが整数であり、文字列を使用していたことでした。

q.filter('username = ', username)
q.filter('machine_id = ', int(machine_id))
                          ^^^

タイプを想定することの悪い点です。

みんなありがとう。

于 2012-08-20T04:44:48.437 に答える
0

関数の値を自分の値に戻していないためのようですprint(私もこれを常に行う場合と行わない場合があります:))。これを試して:

def query(username, machine_id)
    q = db.GqlQuery('SELECT * FROM User_Machine WHERE username=:1 AND machine_id=:2', username, machine_id)
    r = q.get()
    return r # or just return q.get()

User_Machineこれにより、オブジェクト(および期待するようなフォーマットされた辞書/その他の応答ではない)が返されることに注意してください。このオブジェクトを処理する必要があります(たとえばprint、変数に割り当てる代わりに、をresult実行してその属性にアクセスできますresult.machine_id。等。)。

Queryオブジェクトを使用して、同じことを実行することもできます。

def query(username, machine_id)
    # Same as using SELECT * in the Gql query above)
    q = User_Machine.all()

    # Then apply the filters (you can also do q.filter(..).filter(..))
    q.filter('username = ', username)
    q.filter('machine_id = ', machine_id)
    return q.get()
于 2012-08-19T18:06:45.913 に答える