heya -

haven't run it yet but if you are on SQLAlchemy 1.3, the signature for case() 
is different (sorry, note the list ):

https://docs.sqlalchemy.org/en/13/core/sqlelement.html?highlight=case#sqlalchemy.sql.expression.case

expr = case(
            [(cls.Type == "SELL", cast(cls.Units * cls.UnitPrice, Numeric(9, 
2)) - cls.Brokerage)],
            else_=cast(cls.Units * cls.UnitPrice, Numeric(9, 2)) + cls.Brokerage
        )


On Fri, Nov 19, 2021, at 2:06 AM, gvv wrote:
> Hi All,
> 
> Sorry About my previous post - did not read the posting Guidelines.
> 
> Using Sqlalchemy 1.3.23
> In this example using SQLlite memory, but is also happening in Postgresql 12.9
> 
> class TotalCostComparator(Comparator):
>     def __init__(self, cls):
>          expr = case(
>             (cls.Type == "SELL", cast(cls.Units * cls.UnitPrice, Numeric(9, 
> 2)) - cls.Brokerage),
>             else_=cast(cls.Units * cls.UnitPrice, Numeric(9, 2)) + 
> cls.Brokerage
>          )
>    def asc(self):
>       expr = self.__clause_element__()
>       return asc(expr)
>    def desc(self):
>     expr = self.__clause_element__()
>     return desc(expr)
> 
> class Transaction(Base):
> __tablename__ = "Transactions"
> Id = Column(Integer, autoincrement=True, primary_key=True, nullable=False)
> Type = Column(Enum("BUY", "SELL", name="HoldingTransactionType"),
> nullable=False, default="BUY"
> )
> Units = Column(Integer, nullable=False)
> UnitPrice = Column(Numeric(9, 4), nullable=False)
> Brokerage = Column(Numeric(9, 2))
> 
> # calculated columns
> @hybrid_property
> def total_value(self):
> return self.Units * self.UnitPrice
> 
> @total_value.comparator
> def total_value(cls):
> return TotalValueComparator(cls)
> 
> @hybrid_property
> def total_cost(self):
> if self.Type == "SELL":
> return self.total_value - self.Brokerage
> return self.total_value + self.Brokerage
> 
> @total_cost.comparator
> def total_cost(cls):
> return TotalCostComparator(cls)
> 
> I am getting an error in this code:
> session.query(Transaction).order_by(desc(Transaction.total_cost)).all()
> 
> with this traceback:
> Traceback (most recent call last):
>   File "testhybrid.py", line 122, in <module>
>     trans = 
> db_session.query(Transaction).order_by(desc(Transaction.total_cost)).all()
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/ext/hybrid.py",
>  line 898, in __get__
>     return self._expr_comparator(owner)
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/ext/hybrid.py",
>  line 1105, in expr_comparator
>     comparator(owner),
>   File "testhybrid.py", line 75, in total_cost
>     return TotalCostComparator(cls)
>   File "testhybrid.py", line 31, in __init__
>     expr = case(
>   File "<string>", line 2, in case
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 2437, in __init__
>     whenlist = [
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 2439, in <listcomp>
>     for (c, r) in whens
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/operators.py",
>  line 432, in __getitem__
>     return self.operate(getitem, index)
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 762, in operate
>     return op(self.comparator, *other, **kwargs)
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/operators.py",
>  line 432, in __getitem__
>     return self.operate(getitem, index)
>   File "<string>", line 1, in <lambda>
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/type_api.py",
>  line 67, in operate
>     return o[0](self.expr, op, *(other + o[1:]), **kwargs)
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/default_comparator.py",
>  line 237, in _getitem_impl
>     _unsupported_impl(expr, op, other, **kw)
>   File 
> "/home/gvv/Projects/uby/venv/lib/python3.8/site-packages/sqlalchemy/sql/default_comparator.py",
>  line 241, in _unsupported_impl
>     raise NotImplementedError(
> NotImplementedError: Operator 'getitem' is not supported on this expression
> 
> Sorry couldnt align the code. But I have attached the code to replicate it.
> 
> Thanks in advance,
> George
> 
> 
> 
> 
> 
> -- 
> SQLAlchemy - 
> The Python SQL Toolkit and Object Relational Mapper
>  
> http://www.sqlalchemy.org/
>  
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> description.
> --- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/ddc7e6f0-5e3e-459d-9adf-e02d3220f67cn%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/ddc7e6f0-5e3e-459d-9adf-e02d3220f67cn%40googlegroups.com?utm_medium=email&utm_source=footer>.
> 
> 
> *Attachments:*
>  * testhybrid.py

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/5e2a206a-26ad-4f70-a5e3-f9195cda5a03%40www.fastmail.com.

Reply via email to