On Fri, Jun 20, 2014 at 5:02 AM, AM <ams....@gmail.com> wrote:
> On 06/19/2014 10:24 AM, Mike Bayer wrote:
>>
>> On 6/19/14, 1:05 PM, AM wrote:
>>>
>>> What I am storing is things like string versions of lists, tuples and
>>> dicts, for e.g.:
>>>
>>> str([1, 2, 3])
>>> str({'a':1}
>>>
>>> and so on. ast.literal_eval will only parse those and return those, it
>>> does not evaluate expressions and statements so no real code at all.
>>>
>>> I got around this issue by creating a PythonASTLiteralColumn based on
>>> the example in the docs and that worked perfectly.
>>>
>>> Having said that I would still like to understand how to approach a
>>> situation where I want a hybrid property that is a normal python data
>>> type, if that's possible at all?
>>
>> SQLAlchemy is a bridge between Python and SQL but there is no magic in
>> creating the thing on each side of that bridge.   If you want a SQL
>> query that interrogates a column of data in a way that is meaningful
>> regarding some kind of in-Python behavior, you need to decide how that
>> behavior will be expressed in your SQL query.   The hybrid will work
>> fine at the instance level but if you want it to behave meaningfully in
>> a SQL query you'd first need to know what the SELECT statement you want
>> will actually look like in terms of raw SQL.
>>
>>
> Ah ok, I see what you mean. In my particular case I really don't want
> anything special. Basically if I have a table like I mentioned before:
>
>
>
> class SystemModel(BaseModel):
>     __tablename__ = 'system'
>
>     class_number = DB.Column(DB.Integer, DB.ForeignKey(
>         ClassModel.get_fk('number')), primary_key=True)
>     name = DB.Column(DB.String, nullable=False)
>     _ports = DB.Column('ports', DB.String)
>
> The only queries I am going to be running at the SQL level are of the form:
>
> select _ports from system where _ports is not null;
> select _ports from system where class_number = 1
> update system set _ports="[(1, 2, 3), ...]" where class_number = 1
> inserts and deletes.
>
> What I wanted at the python end was that if I ran this query
>
> select _ports from system where class_number = 1
>
> I would get
> result.ports = [(1, 2, 3), ...]  # python list
>
> instead of
> result.ports = "[(1, 2, 3), ...]"  # python string
>
> As I mentioned I can do that via the custom column type, but wanted to find
> out if there was an easier way that I was missing.
>
> Thanks for all your help.
>
> AM
>

I'm not sure this is really the intended use for hybrid properties.
Hybrid properties exist mostly to allow you to do clever things at
query time (with the class-level "SystemModel.ports" attribute),
whereas all you seem to want is a way of transparently converting a
python data structure to and from a string. For that, I think you want
a TypeDecorator, such as the JSON example in the docs:

http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#marshal-json-strings

Hope that helps,

Simon

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to