OK. So, I'm guessing that the type_ parameter is meant to override the type
that is inferred at creation time. Is that right?

On Mon, Nov 6, 2017 at 9:49 AM, Mike Bayer <mike...@zzzcomputing.com> wrote:

> On Mon, Nov 6, 2017 at 12:37 PM, Tucker Beck <tucker.b...@gmail.com>
> wrote:
> > That fixed it. I'm a bit surprised that passing the type_ argument
> doesn't
> > seem to work. Is that a bug or not how that argument is intended to be
> used?
>
> This is an unusual case because the array you are passing is empty, so
> Postgresql does not have enough information to infer the type, which
> usually it would have (or wouldn't need in some cases).
>
> The psql command line shows the difference:
>
> test=# select ARRAY [15];
>  array
> -------
>  {15}
> (1 row)
>
> test=# select ARRAY [];
> ERROR:  cannot determine type of empty array
> LINE 1: select ARRAY [];
>                ^
> HINT:  Explicitly cast to the desired type, for example ARRAY[]::integer[].
>
>
>
>
>
> >
> > On Friday, November 3, 2017 at 1:52:21 PM UTC-7, Mike Bayer wrote:
> >>
> >> On Fri, Nov 3, 2017 at 2:42 PM, Tucker Beck <tucke...@gmail.com> wrote:
> >> > I'm writing a recursive cte with sqlalchemy, and I want it to
> aggregate
> >> > things in an array as it recurses. However, I'm having trouble
> >> > initializing
> >> > the 'top' half of the cte with an empty array. I've distilled the
> >> > problem
> >> > down the the basic problem of including an empty array in an
> >> > with_entities
> >> > clause. Even when I try to set the type of the array explicitly, the
> sql
> >> > that is produced does not have a type for the emtpy array
> >> >
> >> > Here's a distilation of the problem causing code:
> >> >
> >> > from sqlalchemy import *
> >> > from sqlalchemy.orm import *
> >> > from sqlalchemy.ext.declarative import declarative_base
> >> > from sqlalchemy.dialects.postgresql import array
> >> >
> >> > Base = declarative_base()
> >> >
> >> > class Dummy(Base):
> >> >     __tablename__ = 'dummies'
> >> >     id = Column(Integer, primary_key=True)
> >> >     name = Column(Text)
> >> >
> >> >
> >> > e = create_engine('postgresql+psycopg2://localhost:5432/local_dev',
> >> > echo=False)
> >> > Base.metadata.create_all(e)
> >> > session = Session(e)
> >> >
> >> >
> >> > session.add(Dummy(name='idiot'))
> >> > session.add(Dummy(name='fool'))
> >> >
> >> >
> >> > print(session.query(Dummy).with_entities(
> >> >     Dummy.id,
> >> >     Dummy.name,
> >> >     array([], type_=Integer).label('stuff')
> >> > ).all())
> >> >
> >> > And Here's the error that's being produced:
> >> >
> >> > /venv:cem/ $ python demo2.py
> >> > --- Test with_entities using emtpy array ---
> >> > Traceback (most recent call last):
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 1182, in _execute_context
> >> >     context)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/default.py",
> >> > line 470, in do_execute
> >> >     cursor.execute(statement, parameters)
> >>
> >>
> >> > psycopg2.ProgrammingError: cannot determine type of empty array
> >> > LINE 1: ...s.id AS dummies_id, dummies.name AS dummies_name, ARRAY[]
> >> > AS...
> >> >                                                              ^
> >> > HINT:  Explicitly cast to the desired type, for example
> >> > ARRAY[]::integer[].
> >>
> >>
> >> the error expresses the solution, which is to CAST:
> >>
> >> from sqlalchemy import cast
> >>
> >> expr = cast(array(), ARRAY(Integer))
> >>
> >>
> >> >
> >> >
> >> > The above exception was the direct cause of the following exception:
> >> >
> >> > Traceback (most recent call last):
> >> >   File "demo2.py", line 27, in <module>
> >> >     array([], type_=Integer).label('stuff')
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/query.py",
> >> > line 2703, in all
> >> >     return list(self)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/orm/query.py",
> >> > line 2855, in __iter__
> >> >     return self._execute_and_instances(context)
> >> >   File
> >> >
> >> > "/Users/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
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 945, in execute
> >> >     return meth(self, multiparams, params)
> >> >   File
> >> >
> >> > "/Users/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
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 1053, in _execute_clauseelement
> >> >     compiled_sql, distilled_params
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 1189, in _execute_context
> >> >     context)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 1402, in _handle_dbapi_exception
> >> >     exc_info
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/util/compat.py",
> >> > line 203, in raise_from_cause
> >> >     reraise(type(exception), exception, tb=exc_tb, cause=cause)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/util/compat.py",
> >> > line 186, in reraise
> >> >     raise value.with_traceback(tb)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/base.py",
> >> > line 1182, in _execute_context
> >> >     context)
> >> >   File
> >> >
> >> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/engine/default.py",
> >> > line 470, in do_execute
> >> >     cursor.execute(statement, parameters)
> >> > sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) cannot
> >> > determine type of empty array
> >> > LINE 1: ...s.id AS dummies_id, dummies.name AS dummies_name, ARRAY[]
> >> > AS...
> >> >                                                              ^
> >> > HINT:  Explicitly cast to the desired type, for example
> >> > ARRAY[]::integer[].
> >> >  [SQL: 'SELECT dummies.id AS dummies_id, dummies.name AS
> dummies_name,
> >> > ARRAY[] AS stuff \nFROM dummies']
> >> >
> >> >
> >> > I worked really hard on getting the cte to work (and it does) but now
> >> > that
> >> > I'm trying to aggregate with it, I'm running into what seems like a
> >> > fundamental issue. Any help would be greatly appreciated.
> >> >
> >> > --
> >> > 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+...@googlegroups.com.
> >> > To post to this group, send email to sqlal...@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 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/lRZLupHDzXQ/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