Python 如何使用SQLAlchemy仅选择一列?

Python 如何使用SQLAlchemy仅选择一列?,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我只想从数据库中选择(并返回)一个带有“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_

我只想从数据库中选择(并返回)一个带有“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”列?我也尝试过其他几种方法,但也失败了。“仅加载”是正确的选项吗?

您必须按照以下方式进行操作:

session.query(Table.col1).filter(User.name=='Name')
对象接受实体作为位置参数进行查询,因此只需将其传递给
User.id

user_id = session.query(User.id).\
        filter(User.validation == request.cookies.get("validation")).\
        scalar()
返回第一个结果的第一个元素,如果未找到行,则返回None。它会引发多行的MultipleResultsFound异常

指示只应加载实体的给定基于列的属性,而所有其他属性(标识除外)将被延迟。如果以后确实需要整个
User
model对象,可以这样做。在这种情况下,您的原始查询必须更改为:

user = session.query(User).\
        filter(User.validation == request.cookies.get("validation")).\
        options(load_only("id")).\
        one()
仅返回一个结果或引发异常(0个或多个结果)。如果接受
None
作为“未找到用户”的有效返回值,请使用

请注意,WHERE子句的条件谓词不应作为实体传递给
Query
对象,而应添加

最重要的是,Flask中的视图希望您返回以下内容之一:

  • 有效的响应对象
  • 一串
  • 一个
    (响应、状态、标题)
    元组
  • WSGI应用程序

该机制将把响应对象、字符串或元组以外的任何对象视为WSGI应用程序。在原始代码中,由于缺少对
scalar()
之类的调用,您返回了一个
Query
对象,然后将其视为WSGI应用程序。

要查询一列的内容而不是整个表,我想这可以给你一个关于sqlalchemy本身的提示,它可以让你用不同的语法查询会话

如果您的桌子看起来像:

class User(...):
    id = db.Column(db.Integer, primary_key=True)
    ...
您可以通过以下方式进行查询:

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

这将返回所有用户ID的列表。

问题与查询和数据库连接无关。在@application.route(“/user”,methods=['GET','POST'])语句中,您返回一个用户id,它是从数据库中选择的结果。在Flask中,您应该返回一些内容。

注意:如果调用
Model.query(params)
,您将看到以下错误

ERROR: 'BaseQuery' object is not callable
您需要在
会话中调用
query(params)

例如:

备选方案:

您可以使用
和_实体

示例:获取年龄大于20岁的姓名和年龄


非常感谢。恐怕你提出的两种选择都不起作用。第一个返回错误:TypeError:user()不接受任何参数(给定2个),第二个:TypeError:“user”对象不可调用。我被卡住了!这实际上是一个单独的错误。您的视图似乎期望您返回某种类型的callable。一般来说,我对Flask没有任何经验,因此您必须查阅文档以了解您的视图必须返回的内容。至于如何获取
TypeError:user()不带参数(给定2个)
如果不了解您的实际操作,我不能说任何事情。虽然view函数不需要参数,但它似乎是传递参数的。实际上,请阅读,特别是它如何处理响应对象、字符串或元组以外的任何内容:“如果这些都不起作用,Flask将假定返回值是有效的WSGI应用程序,并将其转换为响应对象。”。我猜您的
User.id
是一个整数,Flask试图将其视为一个成熟的WSGI应用程序。请尝试
返回str(用户id)
。非常有趣,谢谢!return str(user_id)有效。迷人的洞察力。谢谢你的时间。从直觉上看,这应该是可行的,我同意。但错误是:TypeError:“Query”对象不是callable@user1903663检查我的回答:事实上是这样,我回答了这个问题,但看看werkzeug出错alexey的错误堆栈就知道了。
rows = session.query(Model.name).filter(Model.age >= 20).all()
rows = Model.query.with_entities(Model.name, Model.age).filter(Model.age >= 20).all()