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.