Congrats Mike!

I am always amazed how wrong I was on the previous release thinking
"OK, 1.0 should be close" and then you show up with another great
release with a bunch a new features/fixes. That said, I don't care
about the release number. It's just a connection I make when I see a
new release number.

2010/9/7 Michael Bayer <mike...@zzzcomputing.com>:
> SQLAlchemy 0.6.4 is now available, with a significantly large number of 
> enhancements and fixes.
>
> A large focus of this release is on clarification and ease of use, including:
>
> - the largest documentation reorganization since we moved to Sphinx, with an 
> emphasis on
> one-location-per-concept.  no more jumping around to the "API Reference" to 
> find things.
>
> - revamp of the error messages when dealing with primaryjoin issues, more 
> forgiving behavior
> when it's clear what the user intent was
>
> - more warnings for known configurational mistakes with the ORM
>
> Other changes include:
>
> - an up to 90% call reduction within mapper.py when flushing highly 
> polymorphic structures
>
> - Fixed psycopg2 isolation mode setting
>
> - lots of ORM / SQL / engine fixes
>
> I am always amazed at how fast CHANGES grows from the previous release, only 
> around 6 weeks ago.
>
> Download SQLAlchemy 0.6.4 at:
>
> http://www.sqlalchemy.org/download.html
>
> 0.6.4
> =====
> - orm
>  - The name ConcurrentModificationError has been
>    changed to StaleDataError, and descriptive
>    error messages have been revised to reflect
>    exactly what the issue is.   Both names will
>    remain available for the forseeable future
>    for schemes that may be specifying
>    ConcurrentModificationError in an "except:"
>    clause.
>
>  - Added a mutex to the identity map which mutexes
>    remove operations against iteration methods,
>    which now pre-buffer before returning an
>    iterable.   This because asyncrhonous gc
>    can remove items via the gc thread at any time.
>    [ticket:1891]
>
>  - The Session class is now present in sqlalchemy.orm.*.
>    We're moving away from the usage of create_session(),
>    which has non-standard defaults, for those situations
>    where a one-step Session constructor is desired. Most
>    users should stick with sessionmaker() for general use,
>    however.
>
>  - query.with_parent() now accepts transient objects
>    and will use the non-persistent values of their pk/fk
>    attributes in order to formulate the criterion.
>    Docs are also clarified as to the purpose of with_parent().
>
>  - The include_properties and exclude_properties arguments
>    to mapper() now accept Column objects as members in
>    addition to strings.  This so that same-named Column
>    objects, such as those within a join(), can be
>    disambiguated.
>
>  - A warning is now emitted if a mapper is created against a
>    join or other single selectable that includes multiple
>    columns with the same name in its .c. collection,
>    and those columns aren't explictly named as part of
>    the same or separate attributes (or excluded).
>    In 0.7 this warning will be an exception.   Note that
>    this warning is not emitted when the combination occurs
>    as a result of inheritance, so that attributes
>    still allow being overridden naturally.
>    [ticket:1896].  In 0.7 this will be improved further.
>
>  - The primary_key argument to mapper() can now specify
>    a series of columns that are only a subset of
>    the calculated "primary key" columns of the mapped
>    selectable, without an error being raised.  This
>    helps for situations where a selectable's effective
>    primary key is simpler than the number of columns
>    in the selectable that are actually marked as
>    "primary_key", such as a join against two
>    tables on their primary key columns [ticket:1896].
>
>  - An object that's been deleted now gets a flag
>    'deleted', which prohibits the object from
>    being re-add()ed to the session, as previously
>    the object would live in the identity map
>    silently until its attributes were accessed.
>    The make_transient() function now resets this
>    flag along with the "key" flag.
>
>  - make_transient() can be safely called on an
>    already transient instance.
>
>  - a warning is emitted in mapper() if the polymorphic_on
>    column is not present either in direct or derived
>    form in the mapped selectable or in the
>    with_polymorphic selectable, instead of silently
>    ignoring it.  Look for this to become an
>    exception in 0.7.
>
>  - Another pass through the series of error messages
>    emitted when relationship() is configured with
>    ambiguous arguments.   The "foreign_keys"
>    setting is no longer mentioned, as it is almost
>    never needed and it is preferable users set up
>    correct ForeignKey metadata, which is now the
>    recommendation.  If 'foreign_keys'
>    is used and is incorrect, the message suggests
>    the attribute is probably unnecessary.  Docs
>    for the attribute are beefed up.  This
>    because all confused relationship() users on the
>    ML appear to be attempting to use foreign_keys
>    due to the message, which only confuses them
>    further since Table metadata is much clearer.
>
>  - If the "secondary" table has no ForeignKey metadata
>    and no foreign_keys is set, even though the
>    user is passing screwed up information, it is assumed
>    that primary/secondaryjoin expressions should
>    consider only and all cols in "secondary" to be
>    foreign.  It's not possible with "secondary" for
>    the foreign keys to be elsewhere in any case.
>    A warning is now emitted instead of an error,
>    and the mapping succeeds. [ticket:1877]
>
>  - Moving an o2m object from one collection to
>    another, or vice versa changing the referenced
>    object by an m2o, where the foreign key is also a
>    member of the primary key, will now be more
>    carefully checked during flush if the change in
>    value of the foreign key on the "many" side is the
>    result of a change in the primary key of the "one"
>    side, or if the "one" is just a different object.
>    In one case, a cascade-capable DB would have
>    cascaded the value already and we need to look at
>    the "new" PK value to do an UPDATE, in the other we
>    need to continue looking at the "old". We now look
>    at the "old", assuming passive_updates=True,
>    unless we know it was a PK switch that
>    triggered the change. [ticket:1856]
>
>  - The value of version_id_col can be changed
>    manually, and this will result in an UPDATE
>    of the row.  Versioned UPDATEs and DELETEs
>    now use the "committed" value of the
>    version_id_col in the WHERE clause and
>    not the pending changed value. The
>    version generator is also bypassed if
>    manual changes are present on the attribute.
>    [ticket:1857]
>
>  - Repaired the usage of merge() when used with
>    concrete inheriting mappers.  Such mappers frequently
>    have so-called "concrete" attributes, which are
>    subclass attributes that "disable" propagation from
>    the parent - these needed to allow a merge()
>    operation to pass through without effect.
>
>  - Specifying a non-column based argument
>    for column_mapped_collection, including string,
>    text() etc., will raise an error message that
>    specifically asks for a column element, no longer
>    misleads with incorrect information about
>    text() or literal().  [ticket:1863]
>
>  - Similarly, for relationship(), foreign_keys,
>    remote_side, order_by - all column-based
>    expressions are enforced - lists of strings
>    are explicitly disallowed since this is a
>    very common error
>
>  - Dynamic attributes don't support collection
>    population - added an assertion for when
>    set_committed_value() is called, as well as
>    when joinedload() or subqueryload() options
>    are applied to a dynamic attribute, instead
>    of failure / silent failure.  [ticket:1864]
>
>  - Fixed bug whereby generating a Query derived
>    from one which had the same column repeated
>    with different label names, typically
>    in some UNION situations, would fail to
>    propagate the inner columns completely to
>    the outer query.  [ticket:1852]
>
>  - object_session() raises the proper
>    UnmappedInstanceError when presented with an
>    unmapped instance.  [ticket:1881]
>
>  - Applied further memoizations to calculated Mapper
>    properties, with significant (~90%) runtime mapper.py
>    call count reduction in heavily polymorphic mapping
>    configurations.
>
>  - mapper _get_col_to_prop private method used
>    by the versioning example is deprecated;
>    now use mapper.get_property_by_column() which
>    will remain the public method for this.
>
>  - the versioning example works correctly now
>    if versioning on a col that was formerly
>    NULL.
>
> - sql
>  - Calling execute() on an alias() construct is pending
>    deprecation for 0.7, as it is not itself an
>    "executable" construct. It currently "proxies" its
>    inner element and is conditionally "executable" but
>    this is not the kind of ambiguity we like these days.
>
>  - The execute() and scalar() methods of ClauseElement
>    are now moved appropriately to the Executable
>    subclass. ClauseElement.execute()/ scalar() are still
>    present and are pending deprecation in 0.7, but note
>    these would always raise an error anyway if you were
>    not an Executable (unless you were an alias(), see
>    previous note).
>
>  - Added basic math expression coercion for
>    Numeric->Integer,
>    so that resulting type is Numeric regardless
>    of the direction of the expression.
>
>  - Changed the scheme used to generate truncated
>    "auto" index names when using the "index=True"
>    flag on Column.   The truncation only takes
>    place with the auto-generated name, not one
>    that is user-defined (an error would be
>    raised instead), and the truncation scheme
>    itself is now based on a fragment of an md5
>    hash of the identifier name, so that multiple
>    indexes on columns with similar names still
>    have unique names.  [ticket:1855]
>
>  - The generated index name also is based on
>    a "max index name length" attribute which is
>    separate from the "max identifier length" -
>    this to appease MySQL who has a max length
>    of 64 for index names, separate from their
>    overall max length of 255.  [ticket:1412]
>
>  - the text() construct, if placed in a column
>    oriented situation, will at least return NULLTYPE
>    for its type instead of None, allowing it to
>    be used a little more freely for ad-hoc column
>    expressions than before.   literal_column()
>    is still the better choice, however.
>
>  - Added full description of parent table/column,
>    target table/column in error message raised when
>    ForeignKey can't resolve target.
>
>  - Fixed bug whereby replacing composite foreign key
>    columns in a reflected table would cause an attempt
>    to remove the reflected constraint from the table
>    a second time, raising a KeyError.  [ticket:1865]
>
>  - the _Label construct, i.e. the one that is produced
>    whenever you say somecol.label(), now counts itself
>    in its "proxy_set" unioned with that of it's
>    contained column's proxy set, instead of
>    directly returning that of the contained column.
>    This allows column correspondence
>    operations which depend on the identity of the
>    _Labels themselves to return the correct result
>    - fixes ORM bug [ticket:1852].
>
> - engine
>
>  - Calling fetchone() or similar on a result that
>    has already been exhausted, has been closed,
>    or is not a result-returning result now
>    raises ResourceClosedError, a subclass of
>    InvalidRequestError, in all cases, regardless
>    of backend.  Previously, some DBAPIs would
>    raise ProgrammingError (i.e. pysqlite), others
>    would return None leading to downstream breakages
>    (i.e. MySQL-python).
>
>  - Fixed bug in Connection whereby if a "disconnect"
>    event occurred in the "initialize" phase of the
>    first connection pool connect, an AttributeError
>    would be raised when the Connection would attempt
>    to invalidate the DBAPI connection.  [ticket:1894]
>
>  - Connection, ResultProxy, as well as Session use
>    ResourceClosedError for all "this
>    connection/transaction/result is closed" types of
>    errors.
>
>  - Connection.invalidate() can be called more than
>    once and subsequent calls do nothing.
>
> - declarative
>  - if @classproperty is used with a regular class-bound
>    mapper property attribute, it will be called to get the
>    actual attribute value during initialization. Currently,
>    there's no advantage to using @classproperty on a column
>    or relationship attribute of a declarative class that
>    isn't a mixin - evaluation is at the same time as if
>   �...@classproperty weren't used. But here we at least allow
>    it to function as expected.
>
>  - Fixed bug where "Can't add additional column" message
>    would display the wrong name.
>
> - postgresql
>  - Fixed the psycopg2 dialect to use its
>    set_isolation_level() method instead of relying
>    upon the base "SET SESSION ISOLATION" command,
>    as psycopg2 resets the isolation level on each new
>    transaction otherwise.
>
> - mssql
>  - Fixed "default schema" query to work with
>    pymssql backend.
>
> - firebird
>  - Fixed bug whereby a column default would fail to
>    reflect if the "default" keyword were lower case.
>
> - oracle
>  - Added ROWID type to the Oracle dialect, for those
>    cases where an explicit CAST might be needed.
>    [ticket:1879]
>
>  - Oracle reflection of indexes has been tuned so
>    that indexes which include some or all primary
>    key columns, but not the same set of columns
>    as that of the primary key, are reflected.
>    Indexes which contain the identical columns
>    as that of the primary key are skipped within
>    reflection, as the index in that case is assumed
>    to be the auto-generated primary key index.
>    Previously, any index with PK columns present
>    would be skipped.  Thanks to Kent Bower
>    for the patch.  [ticket:1867]
>
>  - Oracle now reflects the names of primary key
>    constraints - also thanks to Kent Bower.
>    [ticket:1868]
>
> - informix
>  - Applied patches from [ticket:1904] to get
>    basic Informix functionality up again.  We
>    rely upon end-user testing to ensure that
>    Informix is working to some degree.
>
> - documentation
>  - The docs have been reorganized such that the "API
>    Reference" section is gone - all the docstrings from
>    there which were public API are moved into the
>    context of the main doc section that talks about it.
>    Main docs divided into "SQLAlchemy Core" and
>    "SQLAlchemy ORM" sections, mapper/relationship docs
>    have been broken out. Lots of sections rewritten
>    and/or reorganized.
>
> - examples
>  - The beaker_caching example has been reorgnized
>    such that the Session, cache manager,
>    declarative_base are part of environment, and
>    custom cache code is portable and now within
>    "caching_query.py".  This allows the example to
>    be easier to "drop in" to existing projects.
>
>  - the history_meta versioning recipe sets "unique=False"
>    when copying columns, so that the versioning
>    table handles multiple rows with repeating values.
>    [ticket:1887]
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@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.
>
>



-- 
Alex | twitter.com/alexconrad

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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