当前位置: 首页 > 面试题库 >

如何使用SQLAlchemy仅选择一列?

柯甫
2023-03-14
问题内容

我只想通过“ where子句”从数据库中选择(并返回)一个字段。代码是:

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”正确的选项吗?


问题答案:

一个Query对象接受实体查询作为位置参数,所以只是通过它User.id

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

scalar()返回第一个结果的第一个元素;如果未找到任何行,则返回None。它为多行引发MultipleResultsFound异常。

load_only()表示仅应加载实体的给定基于列的属性,而其他所有期望标识的属性将被延迟。如果以后确实需要整个User模型对象,则可以采用这种方法。在这种情况下,你的原始查询必须更改为:

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

one()仅返回一个结果或引发异常(0个或多个1个结果)。如果你接受None“没有找到用户”作为有效的返回值,请使用one_or_none()。
请注意,谓词(WHERE子句的条件)不应Query作为实体传递给对象,而应与一起添加filter()

最重要的是,Flask中的视图期望你返回以下之一:

  • a valid response object
  • a string
  • a (response, status, headers) tuple
  • a WSGI application

机器会将响应对象,字符串或元组以外的任何内容都视为WSGI应用程序。在你的原始代码中,Query由于缺少对scalar()此类的调用,你返回了一个对象,然后将该对象视为WSGI应用程序。



 类似资料:
  • 问题内容: 假设我有一个Author表和一个Post表,每个Author可以有多个Post。 现在,随着单SQLAlchemy的查询,我想我所有的活跃作者和最近发布的帖子为每个。 我一直在尝试通过获取子列表来加入作者的工作列表,使用子查询将结果分组在一起,如下所示: 但是,如果我有两个来自同一发布日期的Author帖子,而这些帖子是最新的Posts,则意味着我得到那个Author在我的结果列表中出

  • 问题内容: 我有一个类似下面的生成器函数: 调用此函数的常用方法是: 我的问题是,有什么方法可以随时从生成器中获取一个元素吗?例如,我想做类似的事情: 问题答案: 使用创建一个生成器 每当您想要一件物品时,请使用 (或在Python 2.5或更低版本中)。 如果发电机退出,它将升高。您可以根据需要捕获此异常,也可以将参数使用到:

  • 问题内容: 如何像在SQL中一样添加过滤器,以从特定列中选择非空值? 如何使用SQLAlchemy过滤器执行相同操作? 问题答案: 会产生一个约束: 在列上下文中,产生子句。如果目标是,则生成一个。 或使用(0.7.9中的新功能): 实施操作员。 通常,当与的值进行比较时,会自动生成,解析为。但是,如果与某些平台上的布尔值进行比较,则可能需要显式使用。 演示:

  • 问题内容: 我想使用Hibernate选择单列而不是整个对象。到目前为止,我有这个: 我的问题是上述代码将整个People表返回为一个对象,而不仅仅是“ firstname”。我不确定如何指定仅返回“名字”而不是整个对象。 问题答案: 您可以像这样设置投影: 有了这个,您只能得到名字的回报。 我在同一情况下在堆栈上找到了另一个链接。希望这也将对您有所帮助。

  • 问题内容: 我有一个将两个选择子句与UNION结合使用的查询。我只想选择第一行。我如何使用Union来做到这一点? 问题答案:

  • 问题内容: 我有一个查询,看起来像这样: 这是一个非常基本的查询。除了提取Item的值之外,我还想将其他值添加到混合中,然后将其返回给我。在原始SQL中,我会这样做: 如何通过sqlalchemy手动添加该值? 问题答案: 您需要使用,看起来有点像这样: 注意,该参数无需任何转换即可插入查询;如果您从应用程序外部接受text参数的值,则可能使您暴露于SQL Injection漏洞。如果这是您需要的