Thanks Mike. Cool stuff!
On Nov 19, 1:26 am, Michael Bayer <[EMAIL PROTECTED]> wrote:
> Hello alchemers -
>
> This is an awesome release. I'm excited about this one. With our new
> shiny clean 0.4 codebase, internals are starting to look a lot more
> intelligent, and new things are becoming possible. Call counts are
> going down like a rock. Intents and behaviors are clarifying and
> sharpening....plus Super Mario Galaxy arrives tomorrow so its time for
> a break.
>
> Some highlights of this release:
>
> - you might notice that some eager load operations are suddenly a lot
> faster, particularly on MySQL. This is because we've improved the
> queries that are issued when you use eager loading with LIMIT and/or
> OFFSET; whereas we previously would wrap the LIMITed query in a
> subquery, join back to the mapped table, and then add the eager
> criterion outer joined against the mapped table, a trick we've been
> doing since 0.1.0, we now outer join the eager criterion directly
> against the subquery, and the main mapper pulls rows straight from the
> subquery columns. Improved SQL expression functionality has allowed
> this to be possible. What it means is, an eager load with LIMIT/
> OFFSET uses one less JOIN in all cases. This is an example of SA's
> very rich expression constructs paying off - since a query that is
> much more efficient on the database side trumps the hundred or so
> method calls spent compiling the query anyday.
>
> - session.refresh() and session.expire() can now operate on individual
> instance attributes. Just say session.expire(myobject, ['items',
> 'description', 'name']), and all three of those attributes, whether
> they're just columns or relations to other objects, will go blank
> until you next access them on the instance, at which point they are
> refreshed from the DB. Column attributes will be grouped together in
> a single select() statement and related tables will be lazy loaded
> individually right now. Also, the internal mechanisms used by
> deferred() columns, refresh/expire operations, and polymorphically
> deferred columns have all been merged into one system, which means
> less internal complexity and more consistent behavior.
>
> - the API of the session has been "hardened". This means its going to
> check more closely that operations make sense (and it also no longer
> raises some errors that did not make sense in certain circumstances).
> The biggest gotcha we've observed so far from people using trunk is
> that session.save() is used *only* for entities that have not been
> saved to the database yet. If you put an already-stored instance in
> save(), you'll get an error. This has always been the contract, it
> just hasn't complained previously. If you want to put things in the
> session without caring if they've already been saved or not, use
> session.save_or_update(myinstance). We've also fixed things regarding
> entities that have been de-pickled and placed back into the session -
> some annoying errors that used to occur have been fixed.
>
> - still in the session category, the merge() method gets a
> "dont_load=True" argument. Everyone using caches like memcached can
> now place copies of their cached objects back in the session using
> "myinstance = merge(mycachedinstance, dont_load=True)", and the
> instance will be fully copied as though it were loaded from the
> database, *without* a load operation proceeding; it will trust that
> you want that instance state in the session.
>
> - query.options() are way more intelligent. Suppose you have a large
> bidirectional chain of relations. If you say something like
> query.options(eagerload('orders.items.keywords.items.orders')), it
> will accurately target the 'orders' relation at the end of that chain
> and nothing else. On a similar topic, self-referential eagerloads can
> be set up on the fly, such as
> query.options(eagerload_all('children.children.children')) without
> needing to set the "join_depth" flag on relation().
>
> - method call overhead continues to be cut down. Many expensive calls
> in statement compilation, clauseelement construction, and statement
> execution have been whacked away completely and replaced with simpler
> and more direct behaviors, and results are more accurate and correct.
> This continues along from all that we've done in 0.4 and at this point
> most call counts should be half of what they were in 0.3. I invite
> everyone to take a tour around expression.py, compiler.py, and
> critique; we've had a huge amount of housecleaning in these modules
> (and others), and further suggestions/ideas/flames are entirely
> welcome (though not too early in the morning) on sqlalchemy-devel.
>
> - in the fringe category, you can now define methods like __hash__(),
> __nonzero__(), and __eq__() on your mapped instances and the ORM won't
> get confused; we've rearranged things so that those methods are not
> accessed by the ORM.
>
> - a new, experimental MaxDB dialect, lots of typing fixes for MySQL
> and Oracle, and lots more.
>
> As always, the full list of changes is athttp://www.sqlalchemy.org/CHANGES
> . Check it out then download athttp://www.sqlalchemy.org/download.html
> .
>
> - mike
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---