I'll try this out. The comparator was put in so that queries comparing the
hybrid_type_name against a string would do a proper sub-select against the
EntityType table. If we didn't provide the comparator, the hybrid
expression was used and the resulting query was orders of magnitude slower.
Does adding the correlate_except() method in there compel sqlalchemy to do
a sub-select?

On Tue, Oct 31, 2017 at 10:19 AM, Mike Bayer <mike...@zzzcomputing.com>
wrote:

> that error can be fixed using correlate_except:
>
>     @classmethod
>     def hybrid_type_name_subquery(cls):
>         return select([HybridType.name]).\
>             where(HybridType.id == cls.hybrid_type_id).\
>             correlate_except(HybridType).as_scalar()
>
> but now that we're looking at your queries in full, the comparator
> makes no sense.  It just pulls in HybridType into the FROM clause and
> makes a broken query with "FROM hybrids, hybrid_types" without them
> being joined.
>
> your tests pass just using plain @expression and keeping the
> subqueries contained:
>
>     @hybrid_property
>     def hybrid_type_name(self):
>         return self.hybrid_type.name
>
>     @hybrid_type_name.setter
>     def hybrid_type_name(self, value):
>         self.hybrid_type_id = (
>             select([HybridType.id]).
>             where(HybridType.name == value)
>         )
>
>     @hybrid_type_name.expression
>     def hybrid_type_name(cls):
>         return cls.hybrid_type_name_subquery()
>
>     @classmethod
>     def hybrid_type_name_subquery(cls):
>         return select([HybridType.name]).\
>             where(HybridType.id == cls.hybrid_type_id).as_scalar()
>
>
> for extra protection with correlation, correlate_except looks like this:
>
>     @classmethod
>     def hybrid_type_name_subquery(cls):
>         return select([HybridType.name]).\
>             where(HybridType.id == cls.hybrid_type_id).\
>             correlate_except(HybridType).as_scalar()
>
>
>
>
>
>
> On Tue, Oct 31, 2017 at 12:18 PM, Tucker Beck <tucker.b...@gmail.com>
> wrote:
> > Thanks so much for getting back so fast, Mike!
> >
> > For some background: we started with the expression, but then discovered
> > that the performance we were getting was pretty bad on queries when the
> > table was large and we were filtering by the hybrid attribute. Postgres
> was
> > doing a sequence-scan, and the plan was pretty bad. So, I learned about
> > custom comparators, and that helped the  performance for those kind of
> > queries really dramatically. I didn't realize that the comparator was not
> > meant to be used along-side an expression; I thought they served
> different
> > purposes.
> >
> > Trying your suggestion worked great for order_by. However, filtering on
> the
> > hybrid attribute is failing with complaints about correlation.
> >
> > I revised the code as:
> >
> > from sqlalchemy import *
> > from sqlalchemy.orm import *
> > from sqlalchemy.ext.declarative import declarative_base, declared_attr
> > from sqlalchemy.ext.hybrid import hybrid_property, Comparator
> >
> > Base = declarative_base()
> >
> > class classproperty(property):
> >     """A decorator that behaves like @property except that operates
> >     on classes rather than instances.
> >
> >     The decorator is currently special when using the declarative
> >     module, but note that the
> >     :class:`~.sqlalchemy.ext.declarative.declared_attr`
> >     decorator should be used for this purpose with declarative.
> >
> >     """
> >
> >     def __init__(self, fget, *arg, **kw):
> >         super(classproperty, self).__init__(fget, *arg, **kw)
> >         self.__doc__ = fget.__doc__
> >
> >     def __get__(desc, self, cls):
> >         return desc.fget(cls)
> >
> >
> > class ModelBase(Base):
> >     __abstract__ = True
> >
> >     def __repr__(self):
> >         return "{} ({}:{})".format(type(self).__name__, self.name,
> self.id)
> >
> >
> > class HybridType(ModelBase):
> >     __tablename__ = 'hybrid_types'
> >     id = Column(Integer, primary_key=True)
> >     name = Column(Text)
> >
> >
> > class HybridModel(ModelBase):
> >     __tablename__ = 'hybrids'
> >
> >     id = Column(Integer, primary_key=True)
> >     name = Column(Text)
> >     hybrid_type_id = Column(Integer, ForeignKey('hybrid_types.id'),
> > nullable=False)
> >     hybrid_type = relationship('HybridType')
> >
> >     def __init__(self, *args, **kwargs):
> >         self.hybrid_type_name = self.hybrid_type_identity
> >         return super().__init__(*args, **kwargs)
> >
> >     @classproperty
> >     def hybrid_type_identity(cls):
> >         return cls.__name__
> >
> >     @declared_attr
> >     def __mapper_args__(cls):
> >         return dict(
> >             polymorphic_on=cls.hybrid_type_name_subquery(),
> >             polymorphic_identity=cls.hybrid_type_identity,
> >         )
> >
> >     @hybrid_property
> >     def hybrid_type_name(self):
> >         return self.hybrid_type.name
> >
> >     @hybrid_type_name.setter
> >     def hybrid_type_name(self, value):
> >         self.hybrid_type_id = (
> >             select([HybridType.id]).
> >             where(HybridType.name == value)
> >         )
> >
> >     @classmethod
> >     def hybrid_type_name_subquery(cls):
> >         return select([HybridType.name]).where(HybridType.id ==
> > cls.hybrid_type_id).as_scalar()
> >
> >     class HybridComparator(Comparator):
> >
> >         def __clause_element__(self):
> >             return self.expression.hybrid_type_name_subquery()
> >
> >         def operate(self, op, other):
> >             return op(HybridType.id,
> > select([HybridType.id]).where(HybridType.name == other).as_scalar())
> >
> >     @hybrid_type_name.comparator
> >     def hybrid_type_name(cls):
> >         return cls.HybridComparator(cls)
> >
> >
> > class HybridAlpha(HybridModel):
> >     pass
> >
> >
> > class HybridBeta(HybridModel):
> >     pass
> >
> >
> > e = create_engine("sqlite://", echo=False)
> > Base.metadata.create_all(e)
> > session = Session(e)
> >
> >
> > session.add(HybridType(name=HybridAlpha.hybrid_type_identity))
> > session.add(HybridType(name=HybridBeta.hybrid_type_identity))
> > session.add(HybridAlpha(name='alpha_instance'))
> > session.add(HybridBeta(name='beta_instance'))
> >
> >
> > print("--- Test query from base hybrid model ---")
> > assert session.query(HybridModel).count() == 2
> > print("passed")
> > print("--- Test query from base derived hybrid model ---")
> > assert session.query(HybridAlpha).count() == 1
> > assert session.query(HybridBeta).count() == 1
> > print("passed")
> > print("--- Test query order_by on hybrid attribute ---")
> > assert [
> >     x.hybrid_type_name for x
> >     in session.query(HybridModel).order_by(HybridModel.hybrid_type_name)
> > ] == [HybridAlpha.hybrid_type_identity, HybridBeta.hybrid_type_identity]
> > print("passed")
> > print("--- Test query filter_by on hybrid attribute ---")
> > assert
> > session.query(HybridModel).filter_by(hybrid_type_name=
> HybridAlpha.hybrid_type_identity).count()
> > == 1
> > print("passed")
> > print("--- Test query filtered on hybrid attribute ---")
> > assert session.query(HybridModel).filter(HybridAlpha.hybrid_type_name ==
> > HybridAlpha.hybrid_type_identity).count() == 1
> > print("passed")
> >
> >
> > And here's the output
> >
> > /venv:cem/ $ python demo.py
> > --- Test query from base hybrid model ---
> > passed
> > --- Test query from base derived hybrid model ---
> > passed
> > --- Test query order_by on hybrid attribute ---
> > passed
> > --- Test query filter_by on hybrid attribute ---
> > Traceback (most recent call last):
> >   File "demo.py", line 124, in <module>
> >     assert
> > session.query(HybridModel).filter_by(hybrid_type_name=
> HybridAlpha.hybrid_type_identity).correlate(HybridModel).count()
> > == 1
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 3089, in count
> >     return self.from_self(col).scalar()
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 2843, in scalar
> >     ret = self.one()
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 2814, in one
> >     ret = self.one_or_none()
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 2784, in one_or_none
> >     ret = list(self)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 2855, in __iter__
> >     return self._execute_and_instances(context)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/orm/query.py",
> > line 2878, in _execute_and_instances
> >     result = conn.execute(querycontext.statement, self._params)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/engine/base.py",
> > line 945, in execute
> >     return meth(self, multiparams, params)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/elements.py",
> > line 263, in _execute_on_connection
> >     return connection._execute_clauseelement(self, multiparams, params)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/engine/base.py",
> > line 1046, in _execute_clauseelement
> >     if not self.schema_for_object.is_default else None)
> >   File "<string>", line 1, in <lambda>
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/elements.py",
> > line 436, in compile
> >     return self._compiler(dialect, bind=bind, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/elements.py",
> > line 442, in _compiler
> >     return dialect.statement_compiler(dialect, self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 435, in __init__
> >     Compiled.__init__(self, dialect, statement, **kwargs)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 216, in __init__
> >     self.string = self.process(self.statement, **compile_kwargs)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 242, in process
> >     return obj._compiler_dispatch(self, **kwargs)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1738, in visit_select
> >     text, select, inner_columns, froms, byfrom, kwargs)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1817, in _compose_select_body
> >     for f in froms])
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1817, in <listcomp>
> >     for f in froms])
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1379, in visit_alias
> >     asfrom=True, **kwargs) + \
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/annotation.py",
> > line 80, in _compiler_dispatch
> >     self, visitor, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1716, in visit_select
> >     for name, column in select._columns_plus_names
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1716, in <listcomp>
> >     for name, column in select._columns_plus_names
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1488, in _label_select_column
> >     **column_clause_args
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 664, in visit_label
> >     OPERATORS[operators.as_] + \
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 576, in visit_grouping
> >     return "(" + grouping.element._compiler_dispatch(self, **kwargs) +
> ")"
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1685, in visit_select
> >     froms = self._setup_select_stack(select, entry, asfrom, lateral)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/compiler.py",
> > line 1788, in _setup_select_stack
> >     implicit_correlate_froms=asfrom_froms)
> >   File
> > "/home/tbeck/.virtualenvs/cem/lib/python3.5/site-packages/
> sqlalchemy/sql/selectable.py",
> > line 2843, in _get_display_froms
> >     "manually." % self)
> > sqlalchemy.exc.InvalidRequestError: Select statement 'SELECT
> > hybrid_types.name
> > FROM hybrid_types, hybrids
> > WHERE hybrid_types.id = hybrids.hybrid_type_id' returned no FROM
> clauses due
> > to auto-correlation; specify correlate(<tables>) to control correlation
> > manually.
> >
> > I've tried looking for some examples for how to use correlate and tried
> > stuffing it in a few places and still haven't gotten around this error.
> What
> > am I missing?
> >
> > (Thanks again so much for the quick response)
> >
> >
> > On Mon, Oct 30, 2017 at 4:58 PM, Mike Bayer <mike...@zzzcomputing.com>
> > wrote:
> >>
> >> On Mon, Oct 30, 2017 at 6:43 PM, Tucker Beck <tucker.b...@gmail.com>
> >> wrote:
> >> > I wrestled through getting a model heirarchy to work with single-table
> >> > inheritance that is polymorphic on a hybrid attribute on this mailing
> >> > list a
> >> > while ago.
> >> >
> >> > see: https://groups.google.com/d/topic/sqlalchemy/KJXSHwbhbLA/
> discussion
> >> >
> >> > The problem I'm running into now is that it doesn't seem to work
> >> > correctly
> >> > when I want to use the hybrid property for filtering or ordering.
> >> > This seems to be an issue with auto-correlation, but I can't seem to
> >> > figure
> >> > out how to get it working.
> >> >
> >> > Here is a runnable example:
> >>
> >> OK so lets pdb:
> >>
> >> class HybridBeta(HybridModel):
> >>     pass
> >>
> >>
> >> session = Session()
> >>
> >> import pdb
> >> pdb.set_trace()
> >>
> >>
> >>
> >> what are we getting from HybridModel.hybrid_type_name:
> >>
> >> (Pdb) HybridModel.hybrid_type_name
> >> <sqlalchemy.orm.attributes.create_proxied_attribute.<locals>.Proxy
> >> object at 0x7f95594ca200>
> >>
> >>
> >> that's not right.   I see there's a @comparator and also an
> >> @expression.   Those actually aren't designed to be used together,
> >> you'd use one or the other.     I'm not sure what you're trying to do
> >> but based on the organization of what I see you'd want to do this:
> >>
> >>     @classmethod
> >>     def hybrid_type_name_subquery(cls):
> >>         return select([HybridType.name]).where(HybridType.id ==
> >> cls.hybrid_type_id).as_scalar()
> >>
> >>     class HybridComparator(Comparator):
> >>
> >>         def __clause_element__(self):
> >>             return self.expression.hybrid_type_name_subquery()
> >>
> >>         def operate(self, op, other):
> >>             return op(HybridType.id,
> >> select([HybridType.id]).where(HybridType.name == other).as_scalar())
> >>
> >>     @hybrid_type_name.comparator
> >>     def hybrid_type_name(cls):
> >>         return cls.HybridComparator(cls)
> >>
> >>
> >> which gives you a query:
> >>
> >> print(session.query(HybridModel).order_by(
> HybridModel.hybrid_type_name))
> >>
> >> SELECT hybrids.id AS hybrids_id, hybrids.name AS hybrids_name,
> >> hybrids.hybrid_type_id AS hybrids_hybrid_type_id, (SELECT
> >> hybrid_types.name
> >> FROM hybrid_types
> >> WHERE hybrid_types.id = hybrids.hybrid_type_id) AS _sa_polymorphic_on
> >> FROM hybrids ORDER BY (SELECT hybrid_types.name
> >> FROM hybrid_types
> >> WHERE hybrid_types.id = hybrids.hybrid_type_id)
> >>
> >>
> >>
> >>
> >>
> >> >
> >> > from sqlalchemy import *
> >> > from sqlalchemy.orm import *
> >> > from sqlalchemy.ext.declarative import declarative_base, declared_attr
> >> > from sqlalchemy.ext.hybrid import hybrid_property, Comparator
> >> >
> >> > Base = declarative_base()
> >> >
> >> > class classproperty(property):
> >> >     """A decorator that behaves like @property except that operates
> >> >     on classes rather than instances.
> >> >
> >> >     The decorator is currently special when using the declarative
> >> >     module, but note that the
> >> >     :class:`~.sqlalchemy.ext.declarative.declared_attr`
> >> >     decorator should be used for this purpose with declarative.
> >> >
> >> >     """
> >> >
> >> >     def __init__(self, fget, *arg, **kw):
> >> >         super(classproperty, self).__init__(fget, *arg, **kw)
> >> >         self.__doc__ = fget.__doc__
> >> >
> >> >     def __get__(desc, self, cls):
> >> >         return desc.fget(cls)
> >> >
> >> >
> >> > class ModelBase(Base):
> >> >     __abstract__ = True
> >> >
> >> >     def __repr__(self):
> >> >         return "{} ({}:{})".format(type(self).__name__, self.name,
> >> > self.id)
> >> >
> >> >
> >> > class HybridType(ModelBase):
> >> >     __tablename__ = 'hybrid_types'
> >> >     id = Column(Integer, primary_key=True)
> >> >     name = Column(Text)
> >> >
> >> >
> >> > class HybridModel(ModelBase):
> >> >     __tablename__ = 'hybrids'
> >> >
> >> >     id = Column(Integer, primary_key=True)
> >> >     name = Column(Text)
> >> >     hybrid_type_id = Column(Integer, ForeignKey('hybrid_types.id'),
> >> > nullable=False)
> >> >     hybrid_type = relationship('HybridType')
> >> >
> >> >     def __init__(self, *args, **kwargs):
> >> >         self.hybrid_type_name = self.hybrid_type_identity
> >> >         return super().__init__(*args, **kwargs)
> >> >
> >> >     @classproperty
> >> >     def hybrid_type_identity(cls):
> >> >         return cls.__name__
> >> >
> >> >     @declared_attr
> >> >     def __mapper_args__(cls):
> >> >         return dict(
> >> >             polymorphic_on=cls.hybrid_type_name_subquery(),
> >> >             polymorphic_identity=cls.hybrid_type_identity,
> >> >         )
> >> >
> >> >     @hybrid_property
> >> >     def hybrid_type_name(self):
> >> >         return self.hybrid_type.name
> >> >
> >> >     @hybrid_type_name.setter
> >> >     def hybrid_type_name(self, value):
> >> >         self.hybrid_type_id = (
> >> >             select([HybridType.id]).
> >> >             where(HybridType.name == value)
> >> >         )
> >> >
> >> >     @hybrid_type_name.expression
> >> >     def hybrid_type_name(cls):
> >> >         return cls.hybrid_type_name_subquery()
> >> >
> >> >     @classmethod
> >> >     def hybrid_type_name_subquery(cls):
> >> >         return select([HybridType.name]).where(HybridType.id ==
> >> > cls.hybrid_type_id).as_scalar()
> >> >
> >> >     class HybridComparator(Comparator):
> >> >
> >> >         def operate(self, op, other):
> >> >             return op(HybridType.id,
> >> > select([HybridType.id]).where(HybridType.name == other).as_scalar())
> >> >
> >> >     @hybrid_type_name.comparator
> >> >     def hybrid_type_name(cls):
> >> >         return cls.HybridComparator(cls)
> >> >
> >> >
> >> > class HybridAlpha(HybridModel):
> >> >     pass
> >> >
> >> >
> >> > class HybridBeta(HybridModel):
> >> >     pass
> >> >
> >> >
> >> > e = create_engine("sqlite://", echo=False)
> >> > Base.metadata.create_all(e)
> >> > session = Session(e)
> >> >
> >> >
> >> > session.add(HybridType(name=HybridAlpha.hybrid_type_identity))
> >> > session.add(HybridType(name=HybridBeta.hybrid_type_identity))
> >> > session.add(HybridAlpha(name='alpha_instance'))
> >> > session.add(HybridBeta(name='beta_instance'))
> >> >
> >> >
> >> > print("--- Test query from base hybrid model ---")
> >> > assert session.query(HybridModel).count() == 2
> >> > print("passed")
> >> > print("--- Test query from base derived hybrid model ---")
> >> > assert session.query(HybridAlpha).count() == 1
> >> > assert session.query(HybridBeta).count() == 1
> >> > print("passed")
> >> > print("--- Test query order_by on hybrid attribute ---")
> >> > assert [
> >> >     x.hybrid_type_name for x
> >> >     in session.query(HybridModel).order_by(HybridModel.hybrid_
> type_name)
> >> > ] == [HybridAlpha.hybrid_type_identity, HybridBeta.hybrid_type_
> identity]
> >> > print("passed")
> >> > print("--- Test query filter_by on hybrid attribute ---")
> >> > assert
> >> >
> >> > session.query(HybridModel).filter_by(hybrid_type_name=
> HybridAlpha.hybrid_type_identity).count()
> >> > == 1
> >> > print("passed")
> >> > print("--- Test query filtered on hybrid attribute ---")
> >> > assert session.query(HybridModel).filter(HybridAlpha.hybrid_type_name
> ==
> >> > HybridAlpha.hybrid_type_identity).count() == 1
> >> > print("passed")
> >> >
> >> >
> >> >
> >> > Running this results in the following out put:
> >> > $ python demo.py
> >> > --- Test query from base hybrid model ---
> >> > passed
> >> > --- Test query from base derived hybrid model ---
> >> > passed
> >> > --- Test query order_by on hybrid attribute ---
> >> > Traceback (most recent call last):
> >> >   File "demo.py", line 121, in <module>
> >> >     in session.query(HybridModel).order_by(HybridModel.hybrid_
> type_name)
> >> >   File "<string>", line 2, in order_by
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/base.py",
> >> > line 201, in generate
> >> >     fn(self, *args[1:], **kw)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/query.py",
> >> > line 1589, in order_by
> >> >     criterion = self._adapt_col_list(criterion)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/query.py",
> >> > line 256, in _adapt_col_list
> >> >     for o in cols
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/query.py",
> >> > line 256, in <listcomp>
> >> >     for o in cols
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/elements.py",
> >> > line 4191, in _literal_as_label_reference
> >> >     return _literal_as_text(element)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/elements.py",
> >> > line 4230, in _literal_as_text
> >> >     "instead" % type(element)
> >> > sqlalchemy.exc.ArgumentError: SQL expression object or string
> expected,
> >> > got
> >> > object of type <class 'sqlalchemy.ext.declarative.
> api.DeclarativeMeta'>
> >> > instead
> >> >
> >> > --
> >> > 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 post to this group, send email to sqlalchemy@googlegroups.com.
> >> > Visit this group at https://groups.google.com/group/sqlalchemy.
> >> > For more options, visit https://groups.google.com/d/optout.
> >>
> >> --
> >> 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 a topic in the
> >> Google Groups "sqlalchemy" group.
> >> To unsubscribe from this topic, visit
> >> https://groups.google.com/d/topic/sqlalchemy/M4b5y_d69u0/unsubscribe.
> >> To unsubscribe from this group and all its topics, send an email to
> >> sqlalchemy+unsubscr...@googlegroups.com.
> >> To post to this group, send email to sqlalchemy@googlegroups.com.
> >> Visit this group at https://groups.google.com/group/sqlalchemy.
> >> For more options, visit https://groups.google.com/d/optout.
> >
> >
> >
> >
> > --
> > -=Tucker A. Beck=-
> >
> > Illustrious Writer
> >   Devious Coder
> >     Last Hope for the Free World
> >       Also, Modest
> >
> > --
> > 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 post to this group, send email to sqlalchemy@googlegroups.com.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> 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 a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/sqlalchemy/M4b5y_d69u0/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
-=Tucker A. Beck=-

Illustrious Writer
  Devious Coder
    Last Hope for the Free World
      Also, Modest

-- 
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 post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to