Thank you for all the effort you put in.
SQLAlchemy has been a proven tool for me and as it seems for many others.



 
On Aug 1, 2011, at 02:17 , Michael Bayer wrote:

> SQLAlchemy version 0.7.2 is now available.
> 
> A lot has been going on leading up to this release, and there was actually a 
> bunch more I've wanted to do;  but as we went about six weeks since the last 
> release we've accumulated at least twenty five bug fixes, and it's time for 
> them to go out.    Work continues towards the next release.
> 
> This release features a relatively big change to the mechanics of joined and 
> subquery eager loading, which is that when invoked from a Query (as opposed 
> to from a lazy load), the eager loader will traverse the graph of objects 
> fully regardless of collections and attributes that are already loaded, 
> populating any expired or not-yet-loaded attributes all the way down the 
> hierarchy.   Previously it tried to save time by not descending into already 
> loaded subtrees.   This is to better support the use case of using eager 
> loading in order to fully populate a tree, such that it can be detached and 
> sent to a cache in a fully loaded state.  It is also behaviorally closer to 
> the spirit of "I asked for X, I should get X", i.e. if you say 
> subqueryload(), you'll get your subquery no matter what.
> 
> Other than that there were a *lot* of ORM fixes, most of which have been also 
> applied to the 0.6 branch and will be in 0.6.9.  Also some additional 
> 0.6->0.7 regressions fixed, and some fixes to the new "Mutable" extension 
> including one which was kind of a show stopper.
> 
> Download SQLAlchemy 0.7.2 at:
> 
> http://www.sqlalchemy.org/download.html
> 
> Changelog follows.
> 
> 0.7.2
> =====
> - orm
>  - Feature enhancement: joined and subquery
>    loading will now traverse already-present related
>    objects and collections in search of unpopulated
>    attributes throughout the scope of the eager load
>    being defined, so that the eager loading that is
>    specified via mappings or query options
>    unconditionally takes place for the full depth,
>    populating whatever is not already populated.
>    Previously, this traversal would stop if a related
>    object or collection were already present leading
>    to inconsistent behavior (though would save on
>    loads/cycles for an already-loaded graph). For a
>    subqueryload, this means that the additional
>    SELECT statements emitted by subqueryload will
>    invoke unconditionally, no matter how much of the
>    existing graph is already present (hence the
>    controversy). The previous behavior of "stopping"
>    is still in effect when a query is the result of
>    an attribute-initiated lazyload, as otherwise an
>    "N+1" style of collection iteration can become
>    needlessly expensive when the same related object
>    is encountered repeatedly. There's also an 
>    as-yet-not-public generative Query method 
>    _with_invoke_all_eagers()
>    which selects old/new behavior [ticket:2213]
> 
>  - A rework of "replacement traversal" within
>    the ORM as it alters selectables to be against
>    aliases of things (i.e. clause adaption) includes 
>    a fix for multiply-nested any()/has() constructs 
>    against a joined table structure.  [ticket:2195]
> 
>  - Fixed bug where query.join() + aliased=True
>    from a joined-inh structure to itself on 
>    relationship() with join condition on the child
>    table would convert the lead entity into the 
>    joined one inappropriately.  [ticket:2234]
>    Also in 0.6.9.
> 
>  - Fixed regression from 0.6 where Session.add()
>    against an object which contained None in a
>    collection would raise an internal exception.
>    Reverted this to 0.6's behavior which is to 
>    accept the None but obviously nothing is
>    persisted.  Ideally, collections with None 
>    present or on append() should at least emit a 
>    warning, which is being considered for 0.8.
>    [ticket:2205]
> 
>  - Load of a deferred() attribute on an object
>    where row can't be located raises 
>    ObjectDeletedError instead of failing later
>    on; improved the message in ObjectDeletedError
>    to include other conditions besides a simple
>    "delete". [ticket:2191]
> 
>  - Fixed regression from 0.6 where a get history
>    operation on some relationship() based attributes
>    would fail when a lazyload would emit; this could 
>    trigger within a flush() under certain conditions.
>    [ticket:2224]  Thanks to the user who submitted
>    the great test for this.
> 
>  - Fixed bug apparent only in Python 3 whereby
>    sorting of persistent + pending objects during
>    flush would produce an illegal comparison,
>    if the persistent object primary key 
>    is not a single integer.  [ticket:2228]
>    Also in 0.6.9
> 
>  - Fixed bug whereby the source clause
>    used by query.join() would be inconsistent
>    if against a column expression that combined
>    multiple entities together.  [ticket:2197]
>    Also in 0.6.9
> 
>  - Fixed bug whereby if a mapped class
>    redefined __hash__() or __eq__() to something
>    non-standard, which is a supported use case
>    as SQLA should never consult these,
>    the methods would be consulted if the class
>    was part of a "composite" (i.e. non-single-entity)
>    result set.  [ticket:2215]
>    Also in 0.6.9.
> 
>  - Added public attribute ".validators" to 
>    Mapper, an immutable dictionary view of 
>    all attributes that have been decorated
>    with the @validates decorator.
>    [ticket:2240] courtesy Stefano Fontanelli
> 
>  - Fixed subtle bug that caused SQL to blow
>    up if: column_property() against subquery +
>    joinedload + LIMIT + order by the column
>    property() occurred.  [ticket:2188].
>    Also in 0.6.9
> 
>  - The join condition produced by with_parent
>    as well as when using a "dynamic" relationship
>    against a parent will generate unique
>    bindparams, rather than incorrectly repeating 
>    the same bindparam.  [ticket:2207].
>    Also in 0.6.9.
> 
>  - Added the same "columns-only" check to 
>    mapper.polymorphic_on as used when
>    receiving user arguments to  
>    relationship.order_by, foreign_keys,
>    remote_side, etc.
> 
>  - Fixed bug whereby comparison of column
>    expression to a Query() would not call
>    as_scalar() on the underlying SELECT 
>    statement to produce a scalar subquery,
>    in the way that occurs if you called
>    it on Query().subquery(). [ticket:2190]
> 
>  - Fixed declarative bug where a class inheriting
>    from a superclass of the same name would fail
>    due to an unnecessary lookup of the name
>    in the _decl_class_registry. [ticket:2194]
> 
>  - Repaired the "no statement condition" 
>    assertion in Query which would attempt
>    to raise if a generative method were called
>    after from_statement() were called.
>    [ticket:2199].  Also in 0.6.9.
> 
> - sql
>  - Fixed two subtle bugs involving column 
>    correspondence in a selectable,
>    one with the same labeled subquery repeated, the other
>    when the label has been "grouped" and 
>    loses itself.  Affects [ticket:2188].
> 
> - schema
>  - New feature: with_variant() method on 
>    all types.  Produces an instance of Variant(),
>    a special TypeDecorator which will select
>    the usage of a different type based on the
>    dialect in use. [ticket:2187]
> 
>  - Added an informative error message when 
>    ForeignKeyConstraint refers to a column name in 
>    the parent that is not found.  Also in 0.6.9.
> 
>  - Fixed bug whereby adaptation of old append_ddl_listener()
>    function was passing unexpected **kw through 
>    to the Table event.   Table gets no kws, the MetaData
>    event in 0.6 would get "tables=somecollection",
>    this behavior is preserved.  [ticket:2206]
> 
>  - Fixed bug where "autoincrement" detection on 
>    Table would fail if the type had no "affinity"
>    value, in particular this would occur when using 
>    the UUID example on the site that uses TypeEngine
>    as the "impl".
> 
>  - Added an improved repr() to TypeEngine objects
>    that will only display constructor args which
>    are positional or kwargs that deviate
>    from the default.  [ticket:2209]
> 
> - engine
>  - Context manager provided by Connection.begin()
>    will issue rollback() if the commit() fails,
>    not just if an exception occurs.
> 
>  - Use urllib.parse_qsl() in Python 2.6 and above,
>    no deprecation warning about cgi.parse_qsl()
>    [ticket:1682]
> 
>  - Added mixin class sqlalchemy.ext.DontWrapMixin.
>    User-defined exceptions of this type are never
>    wrapped in StatementException when they 
>    occur in the context of a statement 
>    execution.
> 
>  - StatementException wrapping will display the
>    original exception class in the message.  
> 
>  - Failures on connect which raise dbapi.Error
>    will forward the error to dialect.is_disconnect()
>    and set the "connection_invalidated" flag if 
>    the dialect knows this to be a potentially
>    "retryable" condition.  Only Oracle ORA-01033
>    implemented for now.  [ticket:2201]
> 
> - sqlite
>  - SQLite dialect no longer strips quotes
>    off of reflected default value, allowing
>    a round trip CREATE TABLE to work.  
>    This is consistent with other dialects
>    that also maintain the exact form of
>    the default.  [ticket:2189]
> 
> - postgresql
>  - Added new "postgresql_ops" argument to 
>    Index, allows specification of PostgreSQL
>    operator classes for indexed columns.
>    [ticket:2198]  Courtesy Filip Zyzniewski.
> 
> - mysql
>  - Fixed OurSQL dialect to use ansi-neutral 
>    quote symbol "'" for XA commands instead
>    of '"'.  [ticket:2186].  Also in 0.6.9.
> 
> - mssql
>  - Adjusted the pyodbc dialect such that bound
>    values are passed as bytes and not unicode
>    if the "Easysoft" unix drivers are detected. 
>    This is the same behavior as occurs with
>    FreeTDS.  Easysoft appears to segfault
>    if Python unicodes are passed under
>    certain circumstances.
> 
> - oracle
>  - Added ORA-00028 to disconnect codes, use 
>    cx_oracle _Error.code to get at the code,
>    [ticket:2200].  Also in 0.6.9.
> 
>  - Added ORA-01033 to disconnect codes, which
>    can be caught during a connection 
>    event.  [ticket:2201]
> 
>  - repaired the oracle.RAW type which did not
>    generate the correct DDL.  [ticket:2220]
>    Also in 0.6.9.
> 
>  - added CURRENT to reserved word list.
>    [ticket:2212] Also in 0.6.9.
> 
> -ext
>  - Fixed bug in the mutable extension whereby
>    if the same type were used twice in one
>    mapping, the attributes beyond the first
>    would not get instrumented.
> 
>  - Fixed bug in the mutable extension whereby
>    if None or a non-corresponding type were set, 
>    an error would be raised.  None is now accepted
>    which assigns None to all attributes,
>    illegal values raise ValueError.
> 
> - examples
>  - Repaired the examples/versioning test runner
>    to not rely upon SQLAlchemy test libs,
>    nosetests must be run from within
>    examples/versioning to get around setup.cfg
>    breaking it.
> 
>  - Tweak to examples/versioning to pick the
>    correct foreign key in a multi-level
>    inheritance situation.
> 
>  - Fixed the attribute shard example to check
>    for bind param callable correctly in 0.7 
>    style.
> 
> -- 
> 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.
> 

-- 
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