Hi,
Small extract from the query's _get method:
if not self._populate_existing and not refresh_state and not
self._mapper_zero().always_refresh and lockmode is None:
try:
instance = self.session.identity_map[key]
state = attributes.instance_state(instance)
if state.expired:
try:
state()
except orm_exc.ObjectDeletedError:
self.session._remove_newly_deleted(state)
return None
return instance
except KeyError:
pass
So you have access to the identity map through
session.identity_map[key], where key is:
key = self._only_mapper_zero("get() can only be used against a single
mapped class.").identity_key_from_primary_key(ident)
ident is the primary key for the record you're looking for.
The above will basically return the instance to you if it's already in
the identity map. Though state() will still execute sql to refresh
attributes.
So what you can do is build a loop using something like that going
through all the primary keys you'd like to get directly from the
identity mapper. I'm assuming it's using a pretty good hash so access
should be some constant factor. Then you can use the normal
query.get() to retrieve the ones that failed from the database.
This is really something I would advise against though.
What exactly are you querying for? Why don't you just keep a list of
all the instances you've already loaded?
2009/3/25 Dan F <[email protected]>:
>
> I understand what get() is supposed to do, but it doesn't clear it up
> because it still seems like there should be a way of retrieving a
> *set* of records back from the database at once. I only see a couple
> choices currently. Either I can use filter() and retrieve every
> record in the set (even the ones that are mapped), or I can use get on
> each row individually. Since get() checks the identity map, it won't
> get records it doesn't need to get, but on the other hand, each record
> has to get retrieved in its own call.
>
> Does this make sense, and do I have it right?
>
> Thanks.
>
>
> On Mar 24, 2:08 am, Christiaan Putter <[email protected]> wrote:
>> Hi,
>>
>> You won't be able to get() multiple objects at the same time.
>> query(SomeClass).get(pk1, pk2, pk3) takes in a tuple of values
>> representing the primary key of some record in your table. In this
>> case the primary key consists of three separate columns (thus a
>> composite key), though the record they identify will always be unique
>> within your table. That's sort of the point of it being a primary
>> key. Read the docs for an explanation of what parameters get()
>> expects.
>>
>> Of course you could use filter() and get the same result. I'm not
>> sure but I guess the actual SQL executed by SA should look exactly the
>> same, set echo to True and have a look.
>>
>> The difference being of course that you can use filter to return more
>> then one record.
>>
>> I'm not sure how get() works on databases that don't need primary
>> keys. I'm guessing it won't. Maybe it's in the docs.
>>
>> Hope that cleared things up.
>>
>> Regards,
>> Christian
>>
>> 2009/3/23 Dan F <[email protected]>:
>>
>>
>>
>> > Hi,
>>
>> > Is there a difference between using query.get(ident) and using
>> > query.filter(MyClass.id.in_())? Specifically with regard to how the
>> > mapper is used? If I'm right in my assumption, get() uses the map to
>> > avoid extra lookups, but I question whether the filter method is doing
>> > the same. If I'm correct, shouldn't there be a way to get() multiple
>> > objects at the same time?
>>
>> > Thanks.
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---