Hey list -

The first beta release of SQLAlchemy 0.7 is available for download.    

0.7 is the latest iteration of our yearly cycle where each new version brings 
lots of new features and enhancements, refines APIs and patterns while 
deprecating others, and removes old APIs that have been deprecated for at least 
one major revision series (i.e. throughout 0.6).

The initial push in 0.7 focuses on a reorganization of the "event" system.  
Over the years we've accumulated various "Extension" classes like 
MapperExtension, SessionExtension, as well as core constructs like 
ConnectionProxy, PoolListener, and then a bunch of other more surreptitious 
systems like class instrumentation events, schema association events that were 
not fully public.   In 0.7, everything resembling an event is now available 
through a single unified API called "sqlalchemy.event".   It's a single import 
of a single function listen() that serves as the gateway to associating 
user-defined callables with all events throughout the core and ORM.   All the 
Extension classes and similar still remain for the time being, their underlying 
implementations now routing through event.

At the same time as "event" was going on, I found myself using Ants Aasma's 
"derived attributes" example like crazy in my day job.   This system allows the 
construction of Python class attributes that produce a Python result at the 
object level and a SQL expression at the class level, building upon the 
paradigm already present in a SQLAlchemy mapped class.    I enhanced the 
example in 0.6 such that special cases where the two situations weren't 
completely symmetrical could be implemented using some additional directives.   
 It became apparent that the extremely simple idea in "derived attributes" was 
really a superset of "synonym", "comparable_property", and to some degree 
"composite()".    So in 0.7 we've "mainstreamed" "derived attributes" as 
"sqlalchemy.ext.hybrid".   The "synonym", "comparable_property", and 
"composite"  APIs have been refactored such that their usage is mostly the same 
as it was previously, but their underlying implementation uses approximately 
the same concept as ext.hybrid, and their implementations have been moved out 
of the core ORM modules, allowing us to simplify some things internally.  The 
documentation now encourages the usage of sqlalchemy.ext.hybrid for 
"customized" attributes that produce new expressions derived from the class and 
also function at the instance level, in lieu of synonym and comparable_property.

The third story of 0.7 is that we did a lot more work on speed, which includes 
that we've come up with a viable replacement for the "mutable" behavior of 
certain types, mainly PickleType, composite(), and postgresql.ARRAY.   The 
"mutable" flag on these types is now turned off by default - while the old 
system of detecting "in place mutation" was fine for small jobs, it completely 
cripples the application as it begins to handle higher volumes of data, as it 
relied upon scanning all "mutable" objects in the Session in order to detect 
changes in these attributes.  The autoflush operation basically becomes O(N) 
instead of O(1) the minute an object with a "mutable" attribute is placed in 
the session.

A new system which allows one to construct "on change" events specific to the 
kind of data structure being stored in a scalar value is added in 
"sqlalchemy.ext.mutable".   This is a brand new system that hopefully should 
grow as we move through 0.7 to support various Python structures out of the 
box, like dicts, lists and composites of those.   The turning off of "mutable" 
is likely the one most major "hard change" in the system - if your application 
relies upon in-place mutation of PickleType or postgresql.ARRAY, you'd need to 
turn that flag on until your app can be altered to use the new system.   If 
your application relies upon in-place mutability of composite() (I'm assuming 
this is a very rare scenario, composite() isn't that common in the first 
place), the new system has to be used for that, which requires a little bit of 
modification to the user-defined composite class.   Heavy users of "mutable" 
should notice an immediate effect by switching off of the old system.

A long list of everything to be aware of is ready for viewing at 
http://www.sqlalchemy.org/trac/wiki/07Migration .    While there are many 
changes, it is my impression that the vast majority of applications coded 
against 0.6 will run on 0.7 without modification,   Very few changes are 
backwards incompatible, and of those fifteen changes which are, most are things 
that were never documented or were essentially silent failures.

The purpose of the beta is to get community feedback on the release, including 
any difficulties encountered in upgrading, any regressions noted, experiences 
with the new features and their behaviors.    There's typically three to five 
betas before the 0.7.0 release comes out.

View whats new in 0.7 at:

http://www.sqlalchemy.org/trac/wiki/07Migration

Download SQLAlchemy 0.7b1 at :

http://www.sqlalchemy.org/download.html


-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to