web-dev-qa-db-ja.com

sqlalchemyから最初の行を取得する

次のクエリがあります。

profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))

行があるかどうかを確認するにはどうすればよいですか?最初の行を返すにはどうすればよいですか?

46
Asken

query.one() を使用して1つを取得し、exactly1つの結果を使用します。その他の場合はすべて、処理可能な例外が発生します。

_from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.exc import MultipleResultsFound

try:
    user = session.query(User).one()
except MultipleResultsFound, e:
    print e
    # Deal with it
except NoResultFound, e:
    print e
    # Deal with that as well
_

query.first() もあり、これらの例外を発生させることなく、多くの場合の最初の結果のみを提供します。しかし、結果がないか、思った以上の結果に対処したいので、 query.one() はまさに使用すべきものです。

83
Lukas Graf

Queryオブジェクトで first() 関数を使用できます。これは最初の結果を返します。結果がない場合はNoneを返します。

_result = session.query(profile.name).filter(...).first()

if not result:
    print 'No result found'
_

代わりに one() を使用することもできます。これは唯一のアイテムを提供しますが、ゼロまたは複数の結果を含むクエリに対して例外を発生させます。

_from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
try:
    result = session.query(profile.name).filter(...).one()
    print result
except NoResultFound:
    print 'No result was found'
except MultipleResultsFound:
    print 'Multiple results were found'
_
35
Mark Hildreth

one_or_none() を使用します。最大で1つの結果を返すか、例外を発生させます。

クエリが行を選択しない場合、Noneを返します。

5
Shoham

モデルUserがあると仮定すると、最初の結果を得ることができます:

User.query.first()

テーブルが空の場合、Noneを返します。

3
Aldo Canepa