【问题标题】:Understanding intermediary SQL statements in SQLAlchemy了解 SQLAlchemy 中的中间 SQL 语句
【发布时间】:2011-12-04 22:00:15
【问题描述】:

所以我有表格,我希望用户能够以他们喜欢的任何顺序查看表格。这是一个例子:

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

谢谢!

【问题讨论】:

    标签: python sql sqlalchemy pyramid


    【解决方案1】:

    答案 1: 当您给出任何语法时,它将返回什么,您可以检查该语法的类型,例如

    当你写作时

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

    它将创建一个表达式类型的对象。_UnaryExpression。因此,当我们需要一元运算时,您可以将此表达式提供给 sqlalchemy。现在当你打印它 在[6]中:a = Thing.amount.desc()

    In [7]: print a
    thing.amount DESC
    

    所以当查询运行时,它将被转换为thing.amount DESC。所以当你创建表达式时它不会调用任何东西,它只会创建查询结构。

    答案:2 当您创建查询时,它将创建所需的对象。对于过滤器和排序,它需要表达式,因此如果您直接传递给order_byfilter,那么它将在内部创建相同的对象。所以你可以同时使用这两种方式。

    答案:3

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

    这也是一个表达式,所以你可以给filter_by一个表达式。

    您将从 sqlalchemy 网站了解更多关于 expression 的信息。

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多