On Sep 1, 2010, at 10:50 AM, Kent wrote:
> I'm looking for a way to load mapped attributes for a *Transient*
> object. (I've actually needed exactly this several times... it is a
> recurring need.) Say I have an object and have no intention at this
> point of adding it to the database (so it is not Persistent or even
> Pending), but the local side of the foreign key attributes are
> populated for a specific attribute or collection. I would like to get
> the same SQL or Query that sqla would render if this were a Persistent
> object and a lazy loaded attribute.
>
> For example, say I had an Order object which has a lazily loaded
> Customer relationship.
>
> for a persistent ord object, I say:
>
> ord.customer
>
> and sqlalchemy issues "SELECT customers.customerid ...
> FROM customers
> WHERE customers.customerid = :param_1"
> {'param_1': '7'}
>
> If ord were Transient, but ord.customerid were set to "7", then I
> would like to get the Query object that returns the above SQL, despite
> this being a Transient object, so I can manually populate this
> attribute.
>
> Thanks very much in advance.
Here's the problem with that. You have some object with no association to
any session, and therefore no transaction. Yet you want x.y to emit a query
to the database. What context should this query be executed under ? If
you're looking for an ad-hoc connection from the connection pool, you can
certainly do that but SQLA could never make that decision for you (well if you
used SQLA 0.2 it would, but that was a different time....).
So here perhaps there is actually a Session at play. Why don't you want to
add this object to the Session so that its pending and can do what it needs ?
A common reason is because emiting a Query means autoflush is going to kick in
and try to INSERT the object before its ready. For that we suggest either
getting a hold of the related things ahead of time, or disabling autoflush.
This is easy to do and we have recipes to plug it into "with" here:
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/DisableAutoflush
But going back to your initial request, if you have customerid 7, just
session.query(Customer).get(7). That's the simplest way here. When you're
transient, you're looking to populate ord.customer with something, not as much
have it magically figure itself out with some "pre-flush" kind of behavior.
--
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.