从sqlalchemy获得第一行

Ask*_*ken 49 python sqlalchemy flask flask-sqlalchemy

我有以下查询:

profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))
Run Code Online (Sandbox Code Playgroud)

如何检查是否有一行,如何返回第一行(如果匹配则应该只有一行)?

Luk*_*raf 88

使用 query.one()得到之一,正是一个结果.在所有其他情况下,它将引发您可以处理的异常:

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
Run Code Online (Sandbox Code Playgroud)

还有query.first(),这将给你很多可能的第一个结果,而不会提出这些例外.但既然你想要处理没有结果或超出你想象的情况,query.one()那么你应该使用它.

  • 是的,当你专门询问带有`query(Class.attr)`的映射类的列时,SQLAlchemy将返回一个`sqlalchemy.util._collections.NamedTuple`而不是DB对象. (2认同)
  • 是否可以从`flask-sqlalchemy`导入异常(给定`db = SQLAlchemy(app)`)或者我必须直接导入它吗? (2认同)
  • @Tjorriemorrie你需要从`sqlalchemy`导入它们.`flask-sqlalchemy`模块只是Flask的集成包,它没有子类或包装任何`sqlalchemy`的例外. (2认同)

Mar*_*eth 37

您可以first()在Query对象上使用该函数.这将返回第一个结果,如果没有结果则返回None.

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

if not result:
    print 'No result found'
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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'
Run Code Online (Sandbox Code Playgroud)


Ald*_*epa 13

假设你有一个模型用户,你可以得到第一个结果:

User.query.first()

如果表为空,它将返回 None。


Sho*_*ham 5

使用one_or_none()。最多返回一个结果或引发异常。

如果查询未选择任何行,则返回None。