2016-05-10 8 views
4

「where句」を使用してデータベースから1つのフィールドのみを選択して返したいとします。コードは次のとおりです。SQLAlchemyを使用して列を1つだけ選択するにはどうすればよいですか?

from sqlalchemy.orm import load_only 
    @application.route("/user", methods=['GET', 'POST']) 
    def user(): 
     user_id = session.query(User, User.validation==request.cookies.get("validation")).options(load_only("id")) 
     session.commit() 
     return user_id 

これが失敗し、トレースバックがある:

File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception 
reraise(exc_type, exc_value, tb) 
File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
response = self.full_dispatch_request() 
File "/Library/Python/2.7/site-packages/flask/app.py", line 1478, in full_dispatch_request 
response = self.make_response(rv) 
File "/Library/Python/2.7/site-packages/flask/app.py", line 1577, in make_response 
rv = self.response_class.force_type(rv, request.environ) 
File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 841, in force_type 
response = BaseResponse(*_run_wsgi_app(response, environ)) 
File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 57, in _run_wsgi_app 
return _run_wsgi_app(*args) 
File "/Library/Python/2.7/site-packages/werkzeug/test.py", line 867, in run_wsgi_app 
app_rv = app(environ, start_response) 
TypeError: 'Query' object is not callable 

どのように私は、「ID」列を選択して返すことができますか?私はいくつかの他の方法も試みたが、失敗もした。 「load_only」は正しいオプションですか?

答えて

10

Queryオブジェクトは位置引数として照会するエンティティを受け入れ、これだけUser.idそれを渡す:

user_id = session.query(User.id).\ 
     filter(User.validation == request.cookies.get("validation")).\ 
     scalar() 

scalar()は、最初の要素を返します。行が見つからなかった場合はNoneを返します。複数の行に対してMultipleResultsFound例外が発生します。

は、エンティティの特定の列ベースの属性のみがロードされ、その他はすべて遅延されることを示します。後でUserモデルオブジェクト全体が必要な場合は、これを行うことができます。その場合、あなたの元のクエリは、に変更することがあります。

user = session.query(User).\ 
     filter(User.validation == request.cookies.get("validation")).\ 
     options(load_only("id")).\ 
     one() 

one()戻っ正確に一つの結果または例外(0または1つの以上の結果を)上げます。 「no user found」の有効な戻り値としてNoneを受け入れる場合は、one_or_none()を使用します。

WHERE句の条件である述語は、エンティティとしてQueryオブジェクトに渡されるのではなく、filter()が追加されることに注意してください。

  • 有効な応答オブジェクト
  • 文字列
  • (response, status, headers)タプル
  • WSGIアプリケーション

は、フラスコ内のビューを使用すると、のいずれかを返すことを期待し、それを先頭するには

機械は、応答オブジェクト、文字列、またはタプル以外のものをWSGIアプリケーションとして扱います。元のコードでscalar()などの呼び出しがないためにQueryオブジェクトが返され、WSGIアプリケーションとして処理されました。

+0

ありがとうございます。私はあなたがプロットするオプションのどちらもうまくいないのです。最初のエラーは次のようになります。TypeError:user()は引数なし(2)、2番目の:TypeError: 'User'オブジェクトは呼び出し不可能です。ハマった! – user1903663

+0

これは実際には別のエラーです。あなたの意見は、あなたが何らかの種類のコールバックを返すことを期待しています。私は一般的にフラスコで0回の経験があるので、あなたはあなたのビューが返す必要があるものについてのドキュメントを参照する必要があります。 –

+0

'TypeErrorの取得方法について:user()は引数をとりません(2件)'あなたが実際に行ったことを見ずに何かを言うことはできません。 view関数には引数は渡されていないと思われます。 –

2

あなたはこれらの線に沿って何かをしなければならないでしょう:

session.query(Table.col1).filter(User.name=='Name') 
+0

お時間をいただきありがとうございます。直感的にはうまくいくように見えますが、私は同意します。しかし、エラーです:TypeError: 'クエリ'オブジェクトは呼び出し可能ではありません – user1903663

0

テーブル全体の代わりに1つの列の内容を照会するには、sqlalchemyについてのヒントを与えることができます。別の構文でセッションを照会することができます。あなたがでそれを照会することができ

class User(...): 
    id = db.Column(db.Integer, primary_key=True) 
    ... 

user_ids = session.query(User.id) 
all_ids = user_ids.all() 

これは、すべてのユーザーIDのリストを返すあなたのテーブルのようなものに見える場合

+0

ありがとう、私はこれを行って、あなたに知らせるでしょう。 – user1903663

+0

1年後、まだ列の値を探しています... – ciacicode

1

問題はクエリとdb接続とは関係ありません。 @ application.route( "/ user"、methods = ['GET'、 'POST'])文の中では、データベースからのselectの結果であるuser_idを返します。フラスコでは何かを返すべきですappropriate

+0

実際には真ですが、私は質問に答えましたが、エラースタックでエラーを見ているalexeyはエラーです。 – ciacicode

関連する問題