update: tried with 0.9.10 and I see the same behavior

On Tuesday, October 27, 2015 at 9:01:55 PM UTC-4, Uri Okrent wrote:
>
> Hello, I've created a TypeDecorator for use with postgresql's JSON type, 
> for the purpose of adapting it to sqlite and it's producing an incorrect 
> bind parameter when using JSON's  column index operation.
>
> I'm using sqlalchemy 0.9.4 (I haven't been able to install a more updated 
> version as yet, but I didn't see anything mentioning behavior like this in 
> the changelogs so I thought I'd ask the mailing list).
>
> I have the following class:
> class DynamicProperties(Base):
>     __tablename__ = 'dynamic_properties'
>     guid = Column(Text, primary_key=True)
>     dynamic_properties = Column(JSONDict)
>
> Where JSONDict is simply this:
> class JSONDict(TypeDecorator):
>     """Backend-agnostic JSON type
>
>     Uses native JSON type on postgres or manually serializes/deserializes
>     JSON to Text on others
>
>     """
>     impl = JSON
>
> I removed the actual implementation of the TypeDecorator since this alone 
> seems to be enough to trigger the issue.
>
> If I create a query like this:
> >>> q = session.query(DynamicProperties.dynamic_properties['vol_state'])
> >>> q.all()
>
> It produces this:
> 2015-10-28 02:51:48,445 - sqlalchemy.engine.base.Engine.db - INFO - base::
> _execute_context:903 - SELECT dynamic_properties.dynamic_properties -> %(
> dynamic_properties_1)s AS anon_1
> FROM dynamic_properties
> 2015-10-28 02:51:48,445 - sqlalchemy.engine.base.Engine.db - INFO - base::
> _execute_context:905 - {'dynamic_properties_1': '"vol_state"'}
>
> It looks like the "vol_state" bind parameter is actually being serialized 
> and this always produces a result of (None,) even though the 'vol_state' 
> key is in the JSON dict.
>
> If I change the Column type in the class definition from my JSONDict to 
> plain old JSON:
> class DynamicProperties(Base):
>     __tablename__ = 'dynamic_properties'
>     guid = Column(Text, primary_key=True)
>     dynamic_properties = Column(JSON)
>
> Then the same query produces a correctly quoted bind param:
> 2015-10-28 02:57:05,060 - sqlalchemy.engine.base.Engine.xmsdb - INFO - 
> base::_execute_context:903 - SELECT dynamic_properties.dynamic_properties 
> -> %(dynamic_properties_1)s AS anon_1
> FROM dynamic_properties
> 2015-10-28 02:57:05,061 - sqlalchemy.engine.base.Engine.xmsdb - INFO - 
> base::_execute_context:905 - {'dynamic_properties_1': 'vol_state'}
>
> and a corresponding correct result: (u'active',).
>
> Any clues?
>
> TIA,
> Uri
>

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

Reply via email to