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.

Reply via email to