Well it works properly, thanks once again! 

On Sunday, July 22, 2012 9:01:29 AM UTC+2, Sergey Kucheryavski wrote:
>
> Then I perhaps did not understand how to use column_property correctly. I 
> mean one can do this:
>
> n2 = aliased(Node)
> sel = select([group_concat(...)]).where(n2.lft <= Node.lft).where(n2.rgt 
> >= Node.rgt).order_by(n2.lft).label('url')
> Node.url = column_property(sel)
>
> only when a class is defined, after class definition. And in this case it 
> is not possible to use url field in queries. Will try to read documentation 
> more carefully once again. Thanks a lot!
>
> On Saturday, July 21, 2012 10:04:23 PM UTC+2, Michael Bayer wrote:
>>
>>
>> On Jul 21, 2012, at 3:23 PM, Sergey Kucheryavski wrote:
>>
>> Thank you very much, Michael! 
>>
>> I followed the link you gave and read about @hybrid_property. Seems like 
>> I can also use something like 
>>
>> @hybrid_property
>> def url(self):
>>    sel = 
>> select([func.group_concat(Node.urlname).label('url')]).where(Node.lft <= 
>> self.lft).\
>>       where(Node.rgt >= self.rgt).order_by(Node.lft)
>>    return db.session.execute(sel).first()['url'].replace(',', '/')
>>
>> Is it better or worse alternative to column_property in this case? 
>> Thanks a lot in advance!
>>
>>
>>
>> the hybrid property you have above will work given a Node instance since 
>> you're running the select() statement through execute(), but as written 
>> wouldn't work in an expression, like "Node.url == 'xyz'", unless you 
>> defined an @expression form that produced an inline expression.
>>
>> I almost always use hybrids, but column_property has the one advantage 
>> that it is automatically part of the SELECT emitted whenever you query() 
>> for Node.
>>
>>
>>
>>
>> On Friday, July 20, 2012 4:00:17 PM UTC+2, Michael Bayer wrote:
>>>
>>>
>>> On Jul 20, 2012, at 3:37 AM, Sergey Kucheryavski wrote:
>>>
>>> Hello,
>>>
>>> I want to use a table and ORM for keeping and managing tree of static 
>>> web pages with MPTT approach. The class/table itself is rather simple:
>>>
>>> class Node(db.Model):
>>>     __tablename__ = 'node'
>>>     id = db.Column(db.Integer, primary_key = True)
>>>     parent_id = db.Column(db.Integer, db.ForeignKey(id))
>>>     name = db.Column(db.String(150), nullable = False)
>>>     urlname = db.Column(db.String(150), nullable = False)
>>>     lft = db.Column(db.Integer, nullable = False)
>>>     rgt = db.Column(db.Integer, nullable = False)
>>>
>>> here urlname is the part of full URL a page has, e.g. if we have a page 
>>> Presentations with a list of presentations, with parent page Library and 
>>> available at '/library/presentations', the 'urlname' for this record will 
>>> be 'presentations' and urlname for the parent page, Library, will be 
>>> 'library'. However in this case, every time I need a full URL to the page I 
>>> have to make a query to get it. In standard SQL I can get a list of pages 
>>> with pseudo field 'url' as following:
>>>
>>> select n1.name, (select group_concat(n2.urlname SEPARATOR '/') from 
>>> node n2 where n2.lft <= n1.lft  and n2.rgt >= n1.rgt order by n2.lft asc) 
>>> as url from node n1 
>>>
>>> Is there any way to make SQLAlchemy select this pseudo field 
>>> automatically every time I make a query or fetch an object? Say I do 
>>> something like n = Node.query.filter(name = 'Presentations') and then just 
>>> use n.url?  
>>>
>>> Thanks a lot in advance for any hints!
>>>
>>>
>>> you'd get group_concat via func.group_concat(...), the "SEPARATOR" logic 
>>> you can probably get via op():
>>>
>>> from sqlalchemy import func, literal_column
>>> func.group_concat(Node.urlname.op('SEPARATOR')(literal_column('/'))
>>>
>>> to hook it into the mapping to be automatically selected use 
>>> column_property():  
>>> http://docs.sqlalchemy.org/en/rel_0_7/orm/mapper_config.html?highlight=column_property#using-column-property-for-column-level-options
>>>
>>> since you're looking to fit a whole correlated subquery in there, you'll 
>>> want to build a select() against aliased:
>>>
>>> n2 = aliased(Node)
>>> sel = select([group_concat(...)]).where(n2.lft <= Node.lft).where(n2.rgt 
>>> >= Node.rgt).order_by(n2.lft).label('url')
>>>
>>> Node.url = column_property(sel)
>>>
>>> select() will auto-correlate the FROM list when used as a scalar 
>>> subquery inside of a larger one.
>>>
>>>
>>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/ywNpefZ89LkJ.
To post to this group, send email to sqlalchemy@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