use*_*663 15 python sqlalchemy flask
我想仅使用"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
Run Code Online (Sandbox Code Playgroud)
这失败了,回溯是:
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
Run Code Online (Sandbox Code Playgroud)
如何选择并返回"id"列?我也尝试了其他几种方法,但也失败了."load_only"是正确的选项吗?
Ilj*_*ilä 41
一个Query对象接受要查询的实体作为位置参数,所以只需传递它User.id:
user_id = session.query(User.id).\
filter(User.validation == request.cookies.get("validation")).\
scalar()
Run Code Online (Sandbox Code Playgroud)
scalar()如果没有找到行,则返回第一个结果的第一个元素或None.它为多行引发MultipleResultsFound异常.
load_only()表示只应加载实体的给定的基于列的属性,并且所有其他属性(期望标识)将被延迟.如果您以后确实需要整个User模型对象,那么这可能就是您的选择.在这种情况下,您的原始查询必须更改为:
user = session.query(User).\
filter(User.validation == request.cookies.get("validation")).\
options(load_only("id")).\
one()
Run Code Online (Sandbox Code Playgroud)
one()只返回一个结果或引发异常(0或多于1个结果).如果您接受None"未找到用户"的有效返回值,请使用one_or_none().
请注意,谓词(WHERE子句的标准)不应Query作为实体传递给对象,而是添加filter().
最重要的是,Flask中的视图期望您返回以下之一:
(response, status, headers)元组机器会将响应对象,字符串或元组以外的任何内容视为WSGI应用程序.在原始代码中,Query由于缺少对scalar()此类的调用,您返回了一个对象,然后将其视为WSGI应用程序.
cia*_*ode 10
要查询一列的内容而不是整个表flask-sqlalchemy,我想这可以为您提供有关sqlalchemy 本身的提示,可以让您在执行时使用不同的语法查询会话。
如果您的表看起来像:
class User(...):
id = db.Column(db.Integer, primary_key=True)
...
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式查询:
user_ids = session.query(User.id)
all_ids = user_ids.all()
Run Code Online (Sandbox Code Playgroud)
这将返回所有用户 ID 的列表。
注意:如果你打电话Model.query(params)你会看到以下错误
ERROR: 'BaseQuery' object is not callable
Run Code Online (Sandbox Code Playgroud)
你需要调用query(params)上session
例子:
rows = session.query(Model.name).filter(Model.age >= 20).all()
Run Code Online (Sandbox Code Playgroud)
选择:
您可以使用 with_entities
示例:获取年龄大于 20 的姓名和年龄
rows = Model.query.with_entities(Model.name, Model.age).filter(Model.age >= 20).all()
Run Code Online (Sandbox Code Playgroud)
您必须按照以下方式做一些事情:
session.query(Table.col1).filter(User.name=='Name')
Run Code Online (Sandbox Code Playgroud)