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 sqlalch...@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.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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