On Fri, Nov 13, 2015 at 9:57 AM, Yegor Roganov <yegor....@gmail.com> wrote:
> Simon, thanks for your reply. > > As I said, I'm not sure that this can be solved on the ORM-level, rather > I'm interested in how others solve similar issues. In a small project it's > possible to remember what each method is doing internally, but in large > ones with dozens of programmers it can be a real problem, hence my question. > > On Friday, November 13, 2015 at 12:21:44 PM UTC+2, Simon King wrote: >> >> On Fri, Nov 13, 2015 at 8:16 AM, Yegor Roganov <yego...@gmail.com> wrote: >> >>> Suppose we have a 1 <-> N relation between users and cities (meaning >>> that every user is related with one city). For our domain model "User" we >>> want to define a method "lives_in_london". Code looks like this: >>> >>> class User(Base): >>> id = ... >>> city_id = ... >>> city = relationship("City") >>> def lives_in_london(self): >>> return self.city.name == 'London' >>> >>> class City(Base): >>> id = ... >>> name = Column(String) >>> >>> >>> The problem with this code is that "lives_in_london" method is a leaky >>> abstraction, its client must keep in mind that it may issue a DB query. >>> It's okay as a one-off thing, but will case problems if used in a loop. >>> So to be used efficiently, clients must know to preload the "city" >>> relationship. >>> >>> I know it's a contrived example, but the general question is how to >>> define domain methods that need to access relations. I also know that the >>> question is intrinsic to all ORM, but maybe SQLAlchemy could offer some >>> support. >>> >>> I would appreciate any ideas. >>> >>> >> I'm probably suffering from a lack of imagination here, but this seems >> like an impossible task. How could SQLAlchemy know ahead of time whether >> you are going to access the "city" property on any given user? And whether >> you're going to access it on just one user, or on lots of users in a loop? >> >> If that's not what you meant, perhaps you could suggest an API that would >> do what you wanted? >> >> Simon >> > Did you try using "lazy=joined" as loader strategy of the relationship ? (1) Links: 1 - http://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#using-loader-strategies-lazy-loading-eager-loading -- MartÃn -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.