Понимание промежуточных операторов SQL в SQLAlchemy - PullRequest
1 голос
/ 11 октября 2011

Итак, у меня есть таблица, и я хочу, чтобы пользователи могли просматривать ее в любом порядке. Вот пример:

class Thing(Base):
    __tablename__ = 'thing'
    id = Column(Integer, primary_key=True)
    amount = Column(Integer)
    date = Column(DateTime, default=datetime.now())

    def __init__(self, amount):
        self.amount = amount

Итак, я хотел бы сделать следующий запрос:

 if sort == 'amount':
     orderby = Thing.amount.desc()
 elif sort == 'date':
     orderby = Thing.date.desc()

 things = DBSession.query(Thing).order_by(orderby).all()

Основные вопросы:

  1. Когда я устанавливаю оператор orderby, я что-то на самом деле вызываю или оператор только устанавливается?
  2. Я делаю это правильно и эффективно?
  3. Можно ли сделать это аналогично с фильтрами?

    filterby = Thing.amount == 5

    things = DBSession.query (Thing) .filter_by (filterby) .all ()

Спасибо!

1 Ответ

3 голосов
/ 11 октября 2011

Ответ 1: Когда вы даете какой-либо синтаксис, что именно он вернет, вы можете проверить с типом этого синтаксиса, например

Когда вы пишете

In [5]: Thing.amount.desc()
Out[5]: <sqlalchemy.sql.expression._UnaryExpression object at 0x199a5d0>

Будет создан один объект типа expression._UnaryExpression. Так что это выражение вы можете дать sqlalchemy, когда мы хотим унарную операцию. Теперь, когда вы печатаете это В [6]: a = Thing.amount.desc ()

In [7]: print a
thing.amount DESC

Таким образом, при выполнении запроса он будет преобразован в thing.amount DESC. Поэтому, когда вы создаете выражение, оно не будет вызывать ничего, оно просто создаст структуру запроса.

Ответ: 2 Когда вы создаете запрос, он создает необходимый объект. Для фильтра и упорядочения по нему нужно выражение, поэтому, если вы перейдете непосредственно к order_by или filter, тогда он создаст объект для того же самого внутри. Таким образом, вы можете использовать оба пути.

Ответ: 3

In [8]: Thing.amount == 5
Out[8]: <sqlalchemy.sql.expression._BinaryExpression object at 0x1a1dbd0>

Это также выражение, поэтому вы можете задать выражение для filter_by .

Вы получите больше информации о выражение с сайта sqlalchemy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...