Как я могу выбрать только один столбец с помощью 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_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 " правильным вариантом?

4 ответов


A 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().

в довершение всего, представления в колбе ожидают, что вы вернете один из:

  • действующий объект ответа
  • строка
  • a (response, status, headers) кортежа!--41-->
  • приложение WSGI

механизм будет рассматривать все, кроме объекта ответа, строки или кортежа как приложение WSGI. В исходном коде вы вернули Query объект из-за отсутствия вызова scalar() или такой и это затем рассматривалось как приложение WSGI.


вам придется сделать что-то в этом роде:

session.query(Table.col1).filter(User.name=='Name')

чтобы запросить содержимое одного столбца вместо всей таблицы flask-sqlalchemy, что, я полагаю, может дать вам подсказку о самой sqlalchemy, вы будете запрашивать сеанс, как вы это делаете, с другим синтаксисом.

Если ваша таблица выглядит примерно так:

class User(...):
    id = db.Column(db.Integer, primary_key=True)
    ...

Вы можете запросить его с:

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

возвращает список всех идентификаторов пользователей.


проблема не имеет ничего общего с запросами и подключение к БД. Внутри @приложения.оператор route("/user", methods=['GET', 'POST']) возвращает идентификатор пользователя, который является результатом выбора из базы данных. В фляжку надо что-то вернуть соответствующего.