Hello.

Can't get this to work, I want to get users who is online - users 
where last_read column <= now() - 30 minutes  
With DBSession.query(User).filter(User.is_online) query

But get the following error:

  File "/home/eps/devel/tourclub/pbb/pbb/models/__init__.py", line 147, in 
<module>
    class User(UserMixin, Base):
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/ext/declarative.py", 
line 1273, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/ext/declarative.py", 
line 1078, in _as_declarative
    column_copies[obj] = getattr(cls, name)
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/ext/declarative.py", 
line 1480, in __get__
    return desc.fget(cls)
  File "/home/eps/devel/tourclub/pbb/pbb/models/__init__.py", line 143, in 
is_online
    return column_property(case([(cls.last_read is not None, cls.last_read 
<= func.now() - datetime.timedelta(minutes=30))], else_=False))
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/sql/expression.py", 
line 607, in case
    return _Case(whens, value=value, else_=else_)
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/sql/expression.py", 
line 3016, in __init__
    _literal_as_binds(r)) for (c, r) in whens
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/sql/expression.py", 
line 1410, in _no_literals
    "bound value." % element)
sqlalchemy.exc.ArgumentError: Ambiguous literal: True.  Use the 'text()' 
function to indicate a SQL expression literal, or 'literal()' to indicate a 
bound value.


I want to get something like this but in SA...

SELECT * FROM "user" u WHERE (CASE WHEN u.last_read IS NULL THEN False ELSE 
u.last_read <= now() - 30 * INTERVAL '1 minute' END) IS True;


I use next UserMixin class and User declarative model:

class UserMixin(object):
    id = Column(Integer, primary_key=True)
    username = Column(String(255), unique=True, nullable=False)
    ...
    last_read = Column(DateTime)

    @declared_attr
    def is_online(cls):
        return column_property(case([(cls.last_read is not None, 
cls.last_read <= func.now() - datetime.timedelta(minutes=30))], 
else_=False))

class User(UserMixin, Base):
    __tablename__ = 'user'

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/KUr2Iqu__x0J.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to