Thanks Michael, this solved most of my doubts.
Greetings neurino On Nov 16, 5:51 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Nov 16, 2010, at 4:19 AM, neurino wrote: > > > > > > > I didn't mean mapping Root to a Table (if not necessary) is my intent, > > what I'd like to know is how to get the same behavior without the > > bloat of an extra table. > > >> make your application work a certain way (where "certain way" here is not > >> clear) > > > I make an example, maybe I'm wrong tho: > > > let's say I delete an item, I'd expect not to find this item anymore > > in its (ex) parent items > > >>>> subarea.items > > [<item>] > >>>> session.delete(subarea.items[0]) > >>>> session.commit() > >>>> subarea.items > > [] > > > This would be not the same for root's areas if I just use a query > > >>>> root.areas = query(Area).all() > >>>> root.areas > > [<area>] > >>>> session.delete(root.areas[0]) > >>>> session.commit() > >>>> root.items > > [<area>] > > > I hope I has been able to focus on my question now. > > right so I'd just make the attribute "live": > > Session = scoped_session(sessionmaker()) > > class Root(object): > �...@property > def areas(self): > return Session.query(Area).all() > > singleton_root = Root() > > class Area(object): > parent = singleton_root > > This is no different than the example above - > Session.delete(someobject.collection[someindex]) does not remove the item > from the collection - its only because of the call to commit() that > someobject.collection is expired, and is then reloaded. > > If you'd like to later add caching to Root.areas such that the collection is > pulled from memory until Session.commit() is called, you could enhance > Root.areas to maintain values in a cache, such as a WeakKeyDictionary which > uses Session().transaction as the key. > > > > > > > Thanks for your help > > neurino > > > On Nov 15, 9:57 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > >> On Nov 15, 2010, at 10:46 AM, neurino wrote: > > >>> Thanks for your answer first. > > >>> Root is a singleton, its class is not mapped to a table. > > >>> What I mean is I could add a table "roots" to the database with a > >>> sigle row and add areas a foreign key "root_id" and create a > >>> relationship as from subareas with parent area and get what I'm > >>> talking about. > > >> sure, then you're mapping Root to a table, and having just one row. That > >> would make Root.area act exactly like a relationship() though its a little > >> strange to have a row in the database just to make your application work a > >> certain way (where "certain way" here is not clear). > > >>> This relationship, between root and area, as long as areas and > >>> subareas would come in handy for example to traverse the tree for > >>> extracting an xml simply, or to make recursive calculations. > > >>> Before sqlalchemy I was used to add all areas, subareas, items, parent > >>> attributes to classes by myself but now I'm in the situation that 80% > >>> of the work is done by sqlalchemy automatically and I'm not sure how > >>> to fill the remaining, possibly having both areas and subareas behave > >>> at the same way to avoid confusion (just as an example, lazy loading). > > >>> Thanks for your support > >>> neurino > > >>> On Nov 15, 3:49 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > >>>> On Nov 15, 2010, at 8:06 AM, neurino wrote: > > >>>>> So no advice? > > >>>>> Are relationships and backref something more than attributes I can > >>>>> setup with a query? > > >>>>> Thank you for your support. > > >>>> what's not stated clearly here is what "Root" is. If that's not a class > >>>> mapped to a table, then you'd just need to use regular Python attributes > >>>> and descriptors to establish the in-python behavior you're looking for. > >>>> Seems like its essentially some kind of query object, so your > >>>> query.all()/.parent = some_root approach is what you'd go with, though > >>>> it would appear that Root is a singleton anyway, meaning this could be > >>>> established on Area at the class level instead of assigning to each > >>>> instance. > > >>>> Its not clear what other behavior of "relationship()" would apply here, > >>>> since Root has no database identity. > > >>>>> On Nov 11, 9:45 am, neurino <neur...@gmail.com> wrote: > >>>>>> I have a tree structure > > >>>>>> Root > >>>>>> | > >>>>>> +--Area > >>>>>> | | > >>>>>> | +--SubArea > >>>>>> | | | > >>>>>> | | +--Item > >>>>>> | | | > >>>>>> | | +--Item > >>>>>> | | > >>>>>> | +--SubArea > >>>>>> | | > >>>>>> | +--Item > >>>>>> | | > >>>>>> | +--Item > >>>>>> | > >>>>>> +--Area > >>>>>> | > >>>>>> +--SubArea > >>>>>> | | > >>>>>> | +--Item > >>>>>> | | > >>>>>> | +--Item > >>>>>> | > >>>>>> +--SubArea > >>>>>> | > >>>>>> +--Item > >>>>>> | > >>>>>> +--Item > > >>>>>> The tree structure corresponds to slqalchemy db tables `areas`, > >>>>>> `subareas` and `items`. > > >>>>>> Something like this: > > >>>>>> mapper(Area, areas_table, properties={ > >>>>>> 'subareas': relationship(SubArea, backref='parent'), > >>>>>> }) > >>>>>> mapper(SubArea, subareas__table, properties={ > >>>>>> 'items': relationship(Item, backref='parent'), > >>>>>> }) > >>>>>> mapper(Item, items_table) > > >>>>>> so each Area instance will have a `subareas` list and each SubArea > >>>>>> will have a `items` list, > > >>>>>> also I easyly get a backref `parent` from Item to parent SubArea and > >>>>>> from > >>>>>> SubArea to parent Area. > > >>>>>> But this won't be for Root: it will not have a `areas` list in Root > >>>>>> nor its areas will have a parent reference to Root. > > >>>>>> The quick-and-dirty solution is to do this in Root: > > >>>>>> self.areas = query(Area).all() > >>>>>> for area in self.areas: > >>>>>> area.parent = self > > >>>>>> But it won't be the same thing as sqlalchemy `relationship` attributes > >>>>>> so: > >>>>>> are there alternative solutions more sqlalchemy-like? > > >>>>>> Any tip appreciated! > > >>>>>> Thank you for your support > > >>>>>> Greetings > >>>>>> neurino > > >>>>> -- > >>>>> 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 > >>>>> athttp://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 > >>> athttp://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 > > athttp://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.