Thanks for the response.  I am actually trying to do an ARRAY(INET) here, 
and while pscopg2 does have a register_inet() it does not seem to (fully?) 
work with arrays.  The return casting works fine, but I get type "is of 
type inet[] but expression is of type text[]" when trying to bind.

The fix you posted does indeed work great for UUID.  Oddly, I'm still 
getting that type casting error when I try with INET.

class INET_ARRAY(TypeDecorator):
    impl = ARRAY(INET, dimensions=1)

    def bind_expression(self, bindvalue):
        val = bindvalue.value
        if val is None:
            val = []
        elif not hasattr(val, '__iter__'):
            return bindvalue
        
        return array(
            cast(literal(str(inet_val)), INET())
            for inet_val in val
        )

    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "inets" is of 
type inet[] but expression is of type text[]
LINE 1: ... (('2013-01-07T15:05:39.623316'::timestamp), (3), ARRAY['192...
                                                             ^
HINT:  You will need to rewrite or cast the expression.
 'INSERT INTO example_2 (timestamp, num, inets) VALUES (%(timestamp)s, 
%(num)s, %(inets)s)' {'inets': ['192.168.1.1', '192.168.1.2'], 'timestamp': 
(datetime.datetime(2013, 1, 7, 15, 5, 39, 623316),), 'num': (3,)}

I will continue digging into this as I would have expected this to work 
like the UUID example.

Thanks,
Hans


On Monday, January 7, 2013 9:58:18 AM UTC-5, Michael Bayer wrote:
>
> correction, this seems to work, though will try to improve:
>
> class UUID_ARRAY(TypeDecorator):
>     impl = ARRAY(UUID, dimensions=1)
>
>     def bind_expression(self, bindvalue):
>         if bindvalue.callable:
>             val = bindvalue.callable()
>         else:
>             val = bindvalue.value
>         if val is None:
>             val = []
>         elif not hasattr(val, '__iter__'):
>             return bindvalue
>         return array(
>             cast(literal(str(uuid_val)), UUID())
>             for uuid_val in val
>         )
>
>
>
>
> On Jan 7, 2013, at 9:55 AM, Michael Bayer wrote:
>
> this is ticket http://www.sqlalchemy.org/trac/ticket/2648 and cannot be 
> worked around at this time.   If you're working with arrays of UUID I'd 
> recommend using psycopg2 type processors, as the previous poster has had 
> success with.
>
>
>
> On Jan 7, 2013, at 9:39 AM, Hans Lellelid wrote:
>
> I am looking to adapt this code for a related array/type issue.  The code 
> from https://gist.github.com/4433940 works just fine for me (as expected) 
> when building/executing the stmt directly, but not when using the ORM.
>
> When row is created using ORM, like this:
>
>     # <snip>
>     s = Session(bind=engine)
>     e = Example()
>     e.timestamp=datetime.datetime.utcnow(),
>     e.num=2,
>     e.guids = [uuid.uuid4(), uuid.uuid4()]
>     s.add(e)
>     s.commit()
>
> I get an error like this:
>
> <snip>
>     return getter(visitor)(self, **kw)
>   File 
> "/home/hans/workspace/providence/env/lib/python2.7/site-packages/SQLAlchemy-0.8.0b2-py2.7-linux-x86_64.egg/sqlalchemy/sql/compiler.py",
>  
> line 760, in visit_bindparam
>     bind_expression = bindparam.type.bind_expression(bindparam)
>   File "test_array.py", line 38, in bind_expression
>     for uuid_val in val
> TypeError: 'object' object is not iterable
>
> (I can dump in full stack if that would be helpful.) 
>
> Indeed, inspecting that reveals that it is simply an object() instance. 
>  I'm not sure where that is being set or whether there is an obvious 
> workaround here.  I'm sure I'm simply missing obvious when it comes to 
> dealing with native array types and ORM entity instances.
>
> Thanks,
> Hans 
>
> -- 
> 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/-/ZwxFp2iasq0J.
> To post to this group, send email to sqlal...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
>
>
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlal...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
>
>
>

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