On Mon, Nov 6, 2017 at 3:20 PM, Tucker Beck <tucker.b...@gmail.com> wrote:
> OK. So, I'm guessing that the type_ parameter is meant to override the type
> that is inferred at creation time. Is that right?

yes.  it applies a lot more to func.xyz() since there's nothing to
infer there, but an empty array sent to array() also needs it.


>
> 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.

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