0

これは、AppEngine 固有の質問というよりは、Python に関する一般的な質問のほうが多いかもしれません。Google AppEngine GQL クエリがオブジェクトを返すかどうかを判断できません。AppEngine と python は初めてなので、これは簡単な質問かもしれません

私はpythonコードを使用しています:

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890")

ユーザーが返されたかどうかを確認するために、次のことを試みました。

if(user in locals()):
  self.response.out.write('User Exists: ' + user.user_id)
  return
else:
  CreateTheUser()

しかし、私は今、これは最善の方法ではないと考えています。ユーザー (またはユーザーのリスト) がdb.GqlQueryステートメントによって返されたかどうかを確認するより良い方法はありますか?

4

3 に答える 3

1

あなたの例から

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890")

常にクエリオブジェクトを返します<google.appengine.ext.db.Query object at 0xab71f6c>

返された結果を評価するには、次を使用する必要があり.get(), .fetch(),ます--run()はQueryIteratorを提供します。

だから現在あなたの比較

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890")
if user:
  # do something

また

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890")
if user not None:
  # do something

ユーザーがNoneになることはないため、常に合格します。

この特定の例ではuser = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890").get()、1つの結果しか期待できないため、おそらく使用します。次に、if user:比較を行います。

fetch()を使用すると、リストが返されます。これは、複数のユーザーが存在しないことを確認する場合に役立つことがあります。(user_idに対する一意の制約をどのように管理しているかはわかりませんが、それは別の質問です;-)

于 2012-07-13T23:32:50.127 に答える
1

これを試してみてください。クエリが何も返さない場合の値は次のuserようになると思います。None

if user is not None:      #or simply `if user`
    #do something
else:
    #do something else
于 2012-07-13T17:33:43.620 に答える
0

使ってみてくださいtry:

try:
    self.response.out.write('User Exists: ' + user.user_id) 
except AttributeError:
    CreateTheUser()

このアプローチでは、ユーザーの詳細を出力しようとします。ユーザー オブジェクトの属性が定義されていない場合は、AttributeErrorが返されます。組み込みのシステム以外の例外をすべてキャプチャするExceptionを使用することもできます。

EAFP :

許可よりも許しを求める方が簡単です。この一般的な Python コーディング スタイルは、有効なキーまたは属性が存在することを前提としており、その前提が偽であることが判明した場合に例外をキャッチします。このクリーンで高速なスタイルの特徴は、多くの try ステートメントと except ステートメントが存在することです。この手法は、C などの他の多くの言語に共通する LBYL スタイルとは対照的です。

LBYL :

石橋を叩いて渡る。このコーディング スタイルでは、呼び出しまたは検索を行う前に、事前条件を明示的にテストします。このスタイルは、EAFP アプローチとは対照的であり、多数の if ステートメントが存在するという特徴があります。

マルチスレッド環境では、LBYL アプローチは「見ること」と「跳躍すること」の間で競合状態を引き起こす危険性があります。たとえば、コード if key in mapping: return mapping[key] は、テスト後、ルックアップ前に別のスレッドがキーをマッピングから削除すると失敗する可能性があります。この問題は、ロックまたは EAFP アプローチを使用して解決できます。

于 2012-07-13T17:46:06.607 に答える