On Aug 2, 2010, at 1:40 PM, Michael Bayer wrote:
>
> On Aug 2, 2010, at 12:19 PM, Robert Sudwarts wrote:
>
>> Hi,
>>
>> I'm having trouble understanding the correct syntax to be used with
>> Declarative and a column property.
>> The select statement I'm using is:
>> select([func.substr(my_table.c.my_string, 2, 3)]).label(my_substr'),
>> deferred=True
>> And (as per the docs using the expanded syntax, this works as expected.
>>
>> With the Declarative syntax, I've tried:
>>
>> from sqlalchemy.util import classproperty
>> from sqlalchemy.orm ..., column_property
>>
>> class MySubstr(object):
>> @classproperty
>> def my_substr(cls):
>> return column_property(
>>
>> select([func.substr(cls.my_str, 2, 3)]).label('my_substr')
>> )
>>
>> class MyTable(Base, MySubstr):
>> .....
>>
>> and then expect to be able to call a record in MyTable and return its
>> "my_substr", however, all I'm getting is a representation of the object ...
>> eg <sqlalchemy.orm.properties.ColumnProperty object at 0xa4951cc> and no
>> apparent way of seeing its value.
>
oh and also, you don't need the select() here either:
class MyTable(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
my_str = Column('my_str', String)
my_substr = column_property(func.substr(cls.my_str, 2, 3))
> I see nothing wrong with the example, the only potential glitch is that
> "my_str" needs to have a name assigned up front. You didn't illustrate that
> part here, so FYI it would be extremely helpful if you could attach fully
> working examples. In this case the example is:
>
> from sqlalchemy import *
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.util import classproperty
> from sqlalchemy.orm import column_property, sessionmaker
>
> Base = declarative_base()
>
> engine = create_engine('sqlite://', echo=True)
>
> class MySubstr(object):
> @classproperty
> def my_substr(cls):
> return column_property(
> select([func.substr(cls.my_str, 2,
> 3)]).label('my_substr')
> )
>
> class MyTable(Base, MySubstr):
> __tablename__ = 'foo'
> id = Column(Integer, primary_key=True)
> my_str = Column('my_str', String)
>
>
> Base.metadata.create_all(engine)
>
> sess = sessionmaker(engine)()
> m1 = MyTable(my_str='some string')
> sess.add(m1)
> sess.commit()
>
> print m1.my_substr
>
> and it works fine.
>
>
>
>>
>> Should the @classproperty sit within the "MyTable(Base)" itself (ie is there
>> a need for the separate object --
>
> @classproperty is typically specific to the mixin use case, which is why its
> only discussed in the "mixins" section of the declarative documentation.
> It's a useful construct in other situations but you certainly don't need it
> if you aren't using mixins.
>
>
>> and have I been confused by the section on 'mixins' )?
>
> I'm not sure why you're choosing to use a mixin here, as your column_property
> appears to be pretty specific to the MyTable class. if the documentation
> led you to believe that you needed one, I am extremely curious why that is
> the case as mixins are absolutely optional and that would be a serious
> documentation bug. Without the mixin, it is:
>
> class MyTable(Base):
> __tablename__ = 'foo'
> id = Column(Integer, primary_key=True)
> my_str = Column('my_str', String)
> my_substr = column_property(
> select([func.substr(my_str, 2,
> 3)]).label('my_substr')
> )
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.