Thanks so much! I ended up doing the compilation with the
postgresql.dialect() instead of the engine in our source code because of
import ordering, but it worked like a charm!

On Wed, Nov 8, 2017 at 3:21 PM, Mike Bayer <mike...@zzzcomputing.com> wrote:

> On Wed, Nov 8, 2017 at 6:17 PM, Tucker Beck <tucker.b...@gmail.com> wrote:
> > Using the cast worked great. However, now when I want to print the query
> > statement I get an error
> >
> > code:
> > from sqlalchemy import Column, Integer, Text, ARRAY, cast, create_engine
> > from sqlalchemy.orm import Session
> > 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'))
> >
> >
> > query = session.query(Dummy).with_entities(
> >     Dummy.id,
> >     Dummy.name,
> >     cast(array([], type_=Integer), ARRAY(Integer)).label('stuff')
> > )
> > print(str(query.statement))
>
>
> print a Core statement like this:
>
> print(query.statement.compile(e))
>
> however, if you print(query), in 1.1 that will work as well because it
> uses the Engine that comes from the Session associated with the Query.
>
> http://docs.sqlalchemy.org/en/latest/faq/sqlexpressions.
> html#how-do-i-render-sql-expressions-as-strings-possibly-with-bound-
> parameters-inlined
>
> but then also, the above should be amended to include:
>
> http://docs.sqlalchemy.org/en/latest/changelog/migration_11.
> html#stringify-of-query-will-consult-the-session-for-the-correct-dialect
>
>
>
>
> > print(query.all())
> >
> > Output:
> > Traceback (most recent call last):
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/visitors.py",
> > line 77, in _compiler_dispatch
> >     meth = getter(visitor)
> > AttributeError: 'StrSQLCompiler' object has no attribute 'visit_array'
> >
> > During handling of the above exception, another exception occurred:
> >
> > Traceback (most recent call last):
> >   File "demo.py", line 29, in <module>
> >     print(str(query.statement))
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/elements.py",
> > line 446, in __str__
> >     return str(self.compile())
> >   File "<string>", line 1, in <lambda>
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/elements.py",
> > line 436, in compile
> >     return self._compiler(dialect, bind=bind, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/elements.py",
> > line 442, in _compiler
> >     return dialect.statement_compiler(dialect, self, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 435, in __init__
> >     Compiled.__init__(self, dialect, statement, **kwargs)
> >   File
> > "/Users/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
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 242, in process
> >     return obj._compiler_dispatch(self, **kwargs)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/annotation.py",
> > line 80, in _compiler_dispatch
> >     self, visitor, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 1725, in visit_select
> >     for name, column in select._columns_plus_names
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 1725, in <listcomp>
> >     for name, column in select._columns_plus_names
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 1497, in _label_select_column
> >     **column_clause_args
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 664, in visit_label
> >     OPERATORS[operators.as_] + \
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/visitors.py",
> > line 81, in _compiler_dispatch
> >     return meth(self, **kw)
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/compiler.py",
> > line 831, in visit_cast
> >     (cast.clause._compiler_dispatch(self, **kwargs),
> >   File
> > "/Users/tbeck/.virtualenvs/cem/lib/python3.5/site-
> packages/sqlalchemy/sql/visitors.py",
> > line 79, in _compiler_dispatch
> >     raise exc.UnsupportedCompilationError(visitor, cls)
> > sqlalchemy.exc.UnsupportedCompilationError: Compiler
> > <sqlalchemy.sql.compiler.StrSQLCompiler object at 0x11023f470> can't
> render
> > element of type <class 'sqlalchemy.dialects.postgresql.array.array'>
> >
> > Is there any way to address this? We print the generated query out in our
> > debug logging, and it's useful. Would prefer to not have to avoid
> printing
> > the query
> >
> >
> > On Monday, November 6, 2017 at 3:01:30 PM UTC-8, Mike Bayer wrote:
> >>
> >> On Mon, Nov 6, 2017 at 3:20 PM, Tucker Beck <tucke...@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 <mik...@zzzcomputing.com>
> >> > wrote:
> >> >>
> >> >> On Mon, Nov 6, 2017 at 12:37 PM, Tucker Beck <tucke...@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+...@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 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+...@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.
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > -=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+...@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