Source

sqlalchemy / CHANGES

Diff from to

File CHANGES

--*- coding: utf-8; fill-column: 68 -*-
-
-=======
-CHANGES
-=======
-
-0.8.0b1
-=======
-Changes noted below are specific to version 0.8.
-For changes that are in both 0.7 and 0.8, see below
-underneath "0.7.xx".
-
-- general
-  - SQLAlchemy 0.8 now targets Python 2.5 and
-    above.  Python 2.4 is no longer supported.
-
-  - [removed] The "sqlalchemy.exceptions"
-    synonym for "sqlalchemy.exc" is removed
-    fully.  [ticket:2433]
-
-- orm
-  - [removed] The legacy "mutable" system of the
-    ORM, including the MutableType class as well
-    as the mutable=True flag on PickleType
-    and postgresql.ARRAY has been removed.
-    In-place mutations are detected by the ORM
-    using the sqlalchemy.ext.mutable extension,
-    introduced in 0.7.   The removal of MutableType
-    and associated constructs removes a great
-    deal of complexity from SQLAlchemy's internals.
-    The approach performed poorly as it would incur
-    a scan of the full contents of the Session
-    when in use. [ticket:2442]
-
-  - [moved] The InstrumentationManager interface
-    and the entire related system of alternate
-    class implementation is now moved out
-    to sqlalchemy.ext.instrumentation.   This is
-    a seldom used system that adds significant
-    complexity and overhead to the mechanics of
-    class instrumentation.  The new architecture
-    allows it to remain unused until
-    InstrumentationManager is actually imported,
-    at which point it is bootstrapped into
-    the core.
-
-  - [feature] Major rewrite of relationship()
-    internals now allow join conditions which
-    include columns pointing to themselves
-    within composite foreign keys.   A new
-    API for very specialized primaryjoin conditions
-    is added, allowing conditions based on
-    SQL functions, CAST, etc. to be handled
-    by placing the annotation functions
-    remote() and foreign() inline within the
-    expression when necessary.  Previous recipes
-    using the semi-private _local_remote_pairs
-    approach can be upgraded to this new
-    approach. [ticket:1401]
-
-  - [bug] ORM will perform extra effort to determine
-    that an FK dependency between two tables is
-    not significant during flush if the tables
-    are related via joined inheritance and the FK
-    dependency is not part of the inherit_condition,
-    saves the user a use_alter directive.
-    [ticket:2527]
-
-  - [feature] New standalone function with_polymorphic()
-    provides the functionality of query.with_polymorphic()
-    in a standalone form.   It can be applied to any
-    entity within a query, including as the target
-    of a join in place of the "of_type()" modifier.
-    [ticket:2333]
-
-  - [feature] The of_type() construct on attributes
-    now accepts aliased() class constructs as well
-    as with_polymorphic constructs, and works with
-    query.join(), any(), has(), and also
-    eager loaders subqueryload(), joinedload(),
-    contains_eager()
-    [ticket:2438] [ticket:1106]
-
-  - [feature] Improvements to event listening for
-    mapped classes allows that unmapped classes
-    can be specified for instance- and mapper-events.
-    The established events will be automatically
-    set up on subclasses of that class when the
-    propagate=True flag is passed, and the
-    events will be set up for that class itself
-    if and when it is ultimately mapped.
-    [ticket:2585]
-
-  - [bug] The instrumentation events class_instrument(),
-    class_uninstrument(), and attribute_instrument()
-    will now fire off only for descendant classes
-    of the class assigned to listen().  Previously,
-    an event listener would be assigned to listen
-    for all classes in all cases regardless of the
-    "target" argument passed.  [ticket:2590]
-
-  - [bug] with_polymorphic() produces JOINs
-    in the correct order and with correct inheriting
-    tables in the case of sending multi-level
-    subclasses in an arbitrary order or with
-    intermediary classes missing.  [ticket:1900]
-
-  - [feature] The "deferred declarative
-    reflection" system has been moved into the
-    declarative extension itself, using the
-    new DeferredReflection class.  This
-    class is now tested with both single
-    and joined table inheritance use cases.
-    [ticket:2485]
-
-  - [feature] Added new core function "inspect()",
-    which serves as a generic gateway to
-    introspection into mappers, objects,
-    others.   The Mapper and InstanceState
-    objects have been enhanced with a public
-    API that allows inspection of mapped
-    attributes, including filters for column-bound
-    or relationship-bound properties, inspection
-    of current object state, history of
-    attributes, etc.  [ticket:2208]
-
-  - [feature] Calling rollback() within a
-    session.begin_nested() will now only expire
-    those objects that had net changes within the
-    scope of that transaction, that is objects which
-    were dirty or were modified on a flush.  This
-    allows the typical use case for begin_nested(),
-    that of altering a small subset of objects, to
-    leave in place the data from the larger enclosing
-    set of objects that weren't modified in
-    that sub-transaction.  [ticket:2452]
-
-  - [feature] Added utility feature
-    Session.enable_relationship_loading(),
-    supersedes relationship.load_on_pending.
-    Both features should be avoided, however.
-    [ticket:2372]
-
-  - [feature] Added support for .info dictionary argument to
-    column_property(), relationship(), composite().
-    All MapperProperty classes have an auto-creating .info
-    dict available overall.
-
-  - [feature] Adding/removing None from a mapped collection
-    now generates attribute events.  Previously, a None
-    append would be ignored in some cases.  Related
-    to [ticket:2229].
-
-  - [feature] The presence of None in a mapped collection
-    now raises an error during flush.   Previously,
-    None values in collections would be silently ignored.
-    [ticket:2229]
-
-  - [feature] The Query.update() method is now
-    more lenient as to the table
-    being updated.  Plain Table objects are better
-    supported now, and additional a joined-inheritance
-    subclass may be used with update(); the subclass
-    table will be the target of the update,
-    and if the parent table is referenced in the
-    WHERE clause, the compiler will call upon
-    UPDATE..FROM syntax as allowed by the dialect
-    to satisfy the WHERE clause.  MySQL's multi-table
-    update feature is also supported if columns
-    are specified by object in the "values" dicitionary.
-    PG's DELETE..USING is also not available
-    in Core yet.
-
-  - [feature] New session events after_transaction_create
-    and after_transaction_end
-    allows tracking of new SessionTransaction objects.
-    If the object is inspected, can be used to determine
-    when a session first becomes active and when
-    it deactivates.
-
-  - [feature] The Query can now load entity/scalar-mixed
-    "tuple" rows that contain
-    types which aren't hashable, by setting the flag
-    "hashable=False" on the corresponding TypeEngine object
-    in use.  Custom types that return unhashable types
-    (typically lists) can set this flag to False.
-    [ticket:2592]
-
-  - [bug] Improvements to joined/subquery eager
-    loading dealing with chains of subclass entities
-    sharing a common base, with no specific "join depth"
-    provided.  Will chain out to
-    each subclass mapper individually before detecting
-    a "cycle", rather than considering the base class
-    to be the source of the "cycle".  [ticket:2481]
-
-  - [bug] The "passive" flag on Session.is_modified()
-    no longer has any effect. is_modified() in
-    all cases looks only at local in-memory
-    modified flags and will not emit any
-    SQL or invoke loader callables/initializers.
-    [ticket:2320]
-
-  - [bug] The warning emitted when using
-    delete-orphan cascade with one-to-many
-    or many-to-many without single-parent=True
-    is now an error.  The ORM
-    would fail to function subsequent to this
-    warning in any case.  [ticket:2405]
-
-  - [bug] Lazy loads emitted within flush events
-    such as before_flush(), before_update(),
-    etc. will now function as they would
-    within non-event code, regarding consideration
-    of the PK/FK values used in the lazy-emitted
-    query.   Previously,
-    special flags would be established that
-    would cause lazy loads to load related items
-    based on the "previous" value of the
-    parent PK/FK values specifically when called
-    upon within a flush; the signal to load
-    in this way is now localized to where the
-    unit of work actually needs to load that
-    way.  Note that the UOW does
-    sometimes load these collections before
-    the before_update() event is called,
-    so the usage of "passive_updates" or not
-    can affect whether or not a collection will
-    represent the "old" or "new" data, when
-    accessed within a flush event, based
-    on when the lazy load was emitted.
-    The change is backwards incompatible in
-    the exceedingly small chance that
-    user event code depended on the old
-    behavior. [ticket:2350]
-
-  - [feature] Query now "auto correlates" by
-    default in the same way as select() does.
-    Previously, a Query used as a subquery
-    in another would require the correlate()
-    method be called explicitly in order to
-    correlate a table on the inside to the
-    outside.  As always, correlate(None)
-    disables correlation.  [ticket:2179]
-
-  - [feature] The after_attach event is now
-    emitted after the object is established
-    in Session.new or Session.identity_map
-    upon Session.add(), Session.merge(),
-    etc., so that the object is represented
-    in these collections when the event
-    is called.  Added before_attach
-    event to accommodate use cases that
-    need autoflush w pre-attached object.
-    [ticket:2464]
-
-  - [feature] The Session will produce warnings
-    when unsupported methods are used inside the
-    "execute" portion of the flush.   These are
-    the familiar methods add(), delete(), etc.
-    as well as collection and related-object
-    manipulations, as called within mapper-level
-    flush events
-    like after_insert(), after_update(), etc.
-    It's been prominently documented for a long
-    time that  SQLAlchemy cannot guarantee
-    results when the Session is manipulated within
-    the execution of the flush plan,
-    however users are still doing it, so now
-    there's a warning.   Maybe someday the Session
-    will be enhanced to support these operations
-    inside of the flush, but for now, results
-    can't be guaranteed.
-
-  - [bug] Continuing [ticket:2566] regarding extra
-    state post-flush due to event listeners;
-    any states that are marked as "dirty" from an
-    attribute perspective, usually via column-attribute
-    set events within after_insert(), after_update(),
-    etc., will get the "history" flag reset
-    in all cases, instead of only those instances
-    that were part of the flush.  This has the effect
-    that this "dirty" state doesn't carry over
-    after the flush and won't result in UPDATE
-    statements.   A warning is emitted to this
-    effect; the set_committed_state()
-    method can be used to assign attributes on objects
-    without producing history events. [ticket:2582]
-
-  - [feature] ORM entities can be passed
-    to the core select() construct as well
-    as to the select_from(),
-    correlate(), and correlate_except()
-    methods of select(), where they will be unwrapped
-    into selectables. [ticket:2245]
-
-  - [feature] Some support for auto-rendering of a
-    relationship join condition based on the mapped
-    attribute, with usage of core SQL constructs.
-    E.g. select([SomeClass]).where(SomeClass.somerelationship)
-    would render SELECT from "someclass" and use the
-    primaryjoin of "somerelationship" as the WHERE
-    clause.   This changes the previous meaning
-    of "SomeClass.somerelationship" when used in a
-    core SQL context; previously, it would "resolve"
-    to the parent selectable, which wasn't generally
-    useful.  Also works with query.filter().
-    Related to [ticket:2245].
-
-  - [feature] The registry of classes
-    in declarative_base() is now a
-    WeakValueDictionary.  So subclasses of
-    "Base" that are dereferenced will be
-    garbage collected, *if they are not
-    referred to by any other mappers/superclass
-    mappers*. See the next note for this ticket.
-    [ticket:2526]
-
-  - [feature] Conflicts between columns on
-    single-inheritance declarative subclasses,
-    with or without using a mixin, can be resolved
-    using a new @declared_attr usage described
-    in the documentation.  [ticket:2472]
-
-  - [feature] declared_attr can now be used
-    on non-mixin classes, even though this is generally
-    only useful for single-inheritance subclass
-    column conflict resolution.  [ticket:2472]
-
-  - [feature] declared_attr can now be used with
-    attributes that are not Column or MapperProperty;
-    including any user-defined value as well
-    as association proxy objects.  [ticket:2517]
-
-  - [bug] Fixed a disconnect that slowly evolved
-    between a @declared_attr Column and a
-    directly-defined Column on a mixin. In both
-    cases, the Column will be applied to the
-    declared class' table, but not to that of a
-    joined inheritance subclass.   Previously,
-    the directly-defined Column would be placed
-    on both the base and the sub table, which isn't
-    typically what's desired.  [ticket:2565]
-
-  - [feature] *Very limited* support for
-    inheriting mappers to be GC'ed when the
-    class itself is deferenced.  The mapper
-    must not have its own table (i.e.
-    single table inh only) without polymorphic
-    attributes in place.
-    This allows for the use case of
-    creating a temporary subclass of a declarative
-    mapped class, with no table or mapping
-    directives of its own, to be garbage collected
-    when dereferenced by a unit test.
-    [ticket:2526]
-
-  - [feature] Declarative now maintains a registry
-    of classes by string name as well as by full
-    module-qualified name.   Multiple classes with the
-    same name can now be looked up based on a module-qualified
-    string within relationship().   Simple class name
-    lookups where more than one class shares the same
-    name now raises an informative error message.
-    [ticket:2338]
-
-  - [feature] Can now provide class-bound attributes
-    that override columns which are of any
-    non-ORM type, not just descriptors.
-    [ticket:2535]
-
-  - [feature] Added with_labels and
-    reduce_columns keyword arguments to
-    Query.subquery(), to provide two alternate
-    strategies for producing queries with uniquely-
-    named columns.  [ticket:1729].
-
-  - [feature] A warning is emitted when a reference
-    to an instrumented collection is no longer
-    associated with the parent class due to
-    expiration/attribute refresh/collection
-    replacement, but an append
-    or remove operation is received on the
-    now-detached collection.  [ticket:2476]
-
-  - [bug] Declarative can now propagate a column
-    declared on a single-table inheritance subclass
-    up to the parent class' table, when the parent
-    class is itself mapped to a join() or select()
-    statement, directly or via joined inheritance,
-    and not just a Table.   [ticket:2549]
-
-  - [bug] An error is emitted when uselist=False
-    is combined with a "dynamic" loader.
-    This is a warning in 0.7.9.
-
-  - [removed] Deprecated identifiers removed:
-
-    * allow_null_pks mapper() argument
-      (use allow_partial_pks)
-
-    * _get_col_to_prop() mapper method
-      (use get_property_by_column())
-
-    * dont_load argument to Session.merge()
-      (use load=True)
-
-    * sqlalchemy.orm.shard module
-      (use sqlalchemy.ext.horizontal_shard)
-
-- engine
-  - [feature] Connection event listeners can
-    now be associated with individual
-    Connection objects, not just Engine
-    objects.  [ticket:2511]
-
-  - [feature] The before_cursor_execute event
-    fires off for so-called "_cursor_execute"
-    events, which are usually special-case
-    executions of primary-key bound sequences
-    and default-generation SQL
-    phrases that invoke separately when RETURNING
-    is not used with INSERT.  [ticket:2459]
-
-  - [feature] The libraries used by the test suite
-    have been moved around a bit so that they are
-    part of the SQLAlchemy install again.  In addition,
-    a new suite of tests is present in the
-    new sqlalchemy.testing.suite package.  This is
-    an under-development system that hopes to provide
-    a universal testing suite for external dialects.
-    Dialects which are maintained outside of SQLAlchemy
-    can use the new test fixture as the framework
-    for their own tests, and will get for free a
-    "compliance" suite of dialect-focused tests,
-    including an improved "requirements" system
-    where specific capabilities and features can
-    be enabled or disabled for testing.
-
-  - [bug] The Inspector.get_table_names()
-    order_by="foreign_key" feature now sorts
-    tables by dependee first, to be consistent
-    with util.sort_tables and metadata.sorted_tables.
-
-  - [bug] Fixed bug whereby if a database restart
-    affected multiple connections, each
-    connection would individually invoke a new
-    disposal of the pool, even though only
-    one disposal is needed.  [ticket:2522]
-
-  - [feature] Added a new system
-    for registration of new dialects in-process
-    without using an entrypoint.  See the
-    docs for "Registering New Dialects".
-    [ticket:2462]
-
-  - [feature] The "required" flag is set to
-    True by default, if not passed explicitly,
-    on bindparam() if the "value" or "callable"
-    parameters are not passed.
-    This will cause statement execution to check
-    for the parameter being present in the final
-    collection of bound parameters, rather than
-    implicitly assigning None. [ticket:2556]
-
-  - [feature] Various API tweaks to the "dialect"
-    API to better support highly specialized
-    systems such as the Akiban database, including
-    more hooks to allow an execution context to
-    access type processors.
-
-  - [bug] The names of the columns on the
-    .c. attribute of a select().apply_labels()
-    is now based on <tablename>_<colkey> instead
-    of <tablename>_<colname>, for those columns
-    that have a distinctly named .key.
-    [ticket:2397]
-
-  - [feature] Inspector.get_primary_keys() is
-    deprecated; use Inspector.get_pk_constraint().
-    Courtesy Diana Clarke.  [ticket:2422]
-
-  - [bug] The autoload_replace flag on Table,
-    when False, will cause any reflected foreign key
-    constraints which refer to already-declared
-    columns to be skipped, assuming that the
-    in-Python declared column will take over
-    the task of specifying in-Python ForeignKey
-    or ForeignKeyConstraint declarations.
-
-  - [bug] The ResultProxy methods inserted_primary_key,
-    last_updated_params(), last_inserted_params(),
-    postfetch_cols(), prefetch_cols() all
-    assert that the given statement is a compiled
-    construct, and is an insert() or update()
-    statement as is appropriate, else
-    raise InvalidRequestError.  [ticket:2498]
-
-  - [feature] New C extension module "utils" has
-    been added for additional function speedups
-    as we have time to implement.
-
-  - ResultProxy.last_inserted_ids is removed,
-    replaced by inserted_primary_key.
-
-- sql
-  - [feature] Major rework of operator system
-    in Core, to allow redefinition of existing
-    operators as well as addition of new operators
-    at the type level.  New types can be created
-    from existing ones which add or redefine
-    operations that are exported out to column
-    expressions, in a similar manner to how the
-    ORM has allowed comparator_factory.   The new
-    architecture moves this capability into the
-    Core so that it is consistently usable in
-    all cases, propagating cleanly using existing
-    type propagation behavior.  [ticket:2547]
-
-  - [feature] To complement [ticket:2547], types
-    can now provide "bind expressions" and
-    "column expressions" which allow compile-time
-    injection of SQL expressions into statements
-    on a per-column or per-bind level.   This is
-    to suit the use case of a type which needs
-    to augment bind- and result- behavior at the
-    SQL level, as opposed to in the Python level.
-    Allows for schemes like transparent encryption/
-    decryption, usage of Postgis functions, etc.
-    [ticket:1534]
-
-  - [feature] The Core oeprator system now includes
-    the `getitem` operator, i.e. the bracket
-    operator in Python.  This is used at first
-    to provide index and slice behavior to the
-    Postgresql ARRAY type, and also provides a hook
-    for end-user definition of custom __getitem__
-    schemes which can be applied at the type
-    level as well as within ORM-level custom
-    operator schemes.   `lshift` (<<)
-    and `rshift` (>>) are also supported as
-    optional operators.
-
-    Note that this change has the effect that
-    descriptor-based __getitem__ schemes used by
-    the ORM in conjunction with synonym() or other
-    "descriptor-wrapped" schemes will need
-    to start using a custom comparator in order
-    to maintain this behavior.
-
-  - [feature] Revised the rules used to determine
-    the operator precedence for the user-defined
-    operator, i.e. that granted using the ``op()``
-    method.   Previously, the smallest precedence
-    was applied in all cases, now the default
-    precedence is zero, lower than all operators
-    except "comma" (such as, used in the argument
-    list of a ``func`` call) and "AS", and is
-    also customizable via the "precedence" argument
-    on the ``op()`` method.  [ticket:2537]
-
-  - [feature] Added "collation" parameter to all
-    String types.  When present, renders as
-    COLLATE <collation>.  This to support the
-    COLLATE keyword now supported by several
-    databases including MySQL, SQLite, and Postgresql.
-    [ticket:2276]
-
-  - [change] The Text() type renders the length
-    given to it, if a length was specified.
-
-  - [feature] Custom unary operators can now be
-    used by combining operators.custom_op() with
-    UnaryExpression().
-
-  - [bug] A tweak to column precedence which moves the
-    "concat" and "match" operators to be the same as
-    that of "is", "like", and others; this helps with
-    parenthesization rendering when used in conjunction
-    with "IS". [ticket:2564]
-
-  - [feature] Enhanced GenericFunction and func.*
-    to allow for user-defined GenericFunction
-    subclasses to be available via the func.*
-    namespace automatically by classname,
-    optionally using a package name, as well
-    as with the ability to have the rendered
-    name different from the identified name
-    in func.*.
-
-  - [feature] The cast() and extract() constructs
-    will now be produced via the func.* accessor
-    as well, as users naturally try to access these
-    names from func.* they might as well do
-    what's expected, even though the returned
-    object is not a FunctionElement.
-    [ticket:2562]
-
-  - [changed] Most classes in expression.sql
-    are no longer preceded with an underscore,
-    i.e. Label, SelectBase, Generative, CompareMixin.
-    _BindParamClause is also renamed to
-    BindParameter.   The old underscore names for
-    these classes will remain available as synonyms
-    for the foreseeable future.
-
-  - [feature] The Inspector object can now be
-    acquired using the new inspect() service,
-    part of [ticket:2208]
-
-  - [feature] The column_reflect event now
-    accepts the Inspector object as the first
-    argument, preceding "table".   Code which
-    uses the 0.7 version of this very new
-    event will need modification to add the
-    "inspector" object as the first argument.
-    [ticket:2418]
-
-  - [feature] The behavior of column targeting
-    in result sets is now case sensitive by
-    default.   SQLAlchemy for many years would
-    run a case-insensitive conversion on these values,
-    probably to alleviate early case sensitivity
-    issues with dialects like Oracle and
-    Firebird.   These issues have been more cleanly
-    solved in more modern versions so the performance
-    hit of calling lower() on identifiers is removed.
-    The case insensitive comparisons can be re-enabled
-    by setting "case_insensitive=False" on
-    create_engine().  [ticket:2423]
-
-  - [bug] Applying a column expression to a select
-    statement using a label with or without other
-    modifying constructs will no longer "target" that
-    expression to the underlying Column; this affects
-    ORM operations that rely upon Column targeting
-    in order to retrieve results.  That is, a query
-    like query(User.id, User.id.label('foo')) will now
-    track the value of each "User.id" expression separately
-    instead of munging them together.  It is not expected
-    that any users will be impacted by this; however,
-    a usage that uses select() in conjunction with
-    query.from_statement() and attempts to load fully
-    composed ORM entities may not function as expected
-    if the select() named Column objects with arbitrary
-    .label() names, as these will no longer target to
-    the Column objects mapped by that entity.
-    [ticket:2591]
-
-  - [feature] The "unconsumed column names" warning emitted
-    when keys are present in insert.values() or update.values()
-    that aren't in the target table is now an exception.
-    [ticket:2415]
-
-  - [feature] Added "MATCH" clause to ForeignKey,
-    ForeignKeyConstraint, courtesy Ryan Kelly.
-    [ticket:2502]
-
-  - [feature] Added support for DELETE and UPDATE from
-    an alias of a table, which would assumedly
-    be related to itself elsewhere in the query,
-    courtesy Ryan Kelly.  [ticket:2507]
-
-  - [feature] select() features a correlate_except()
-    method, auto correlates all selectables except those
-    passed.
-
-  - [feature] The prefix_with() method is now available
-    on each of select(), insert(), update(), delete(),
-    all with the same API, accepting multiple
-    prefix calls, as well as a "dialect name" so that
-    the prefix can be limited to one kind of dialect.
-    [ticket:2431]
-
-  - [feature] Added reduce_columns() method
-    to select() construct, replaces columns inline
-    using the util.reduce_columns utility function
-    to remove equivalent columns.  reduce_columns()
-    also adds "with_only_synonyms" to limit the
-    reduction just to those columns which have the same
-    name.  The deprecated fold_equivalents() feature is
-    removed [ticket:1729].
-
-  - [feature] Reworked the startswith(), endswith(),
-    contains() operators to do a better job with
-    negation (NOT LIKE), and also to assemble them
-    at compilation time so that their rendered SQL
-    can be altered, such as in the case for Firebird
-    STARTING WITH [ticket:2470]
-
-  - [feature] Added a hook to the system of rendering
-    CREATE TABLE that provides access to the render for each
-    Column individually, by constructing a @compiles
-    function against the new schema.CreateColumn
-    construct.  [ticket:2463]
-
-  - [feature] "scalar" selects now have a WHERE method
-    to help with generative building.  Also slight adjustment
-    regarding how SS "correlates" columns; the new methodology
-    no longer applies meaning to the underlying
-    Table column being selected.  This improves
-    some fairly esoteric situations, and the logic
-    that was there didn't seem to have any purpose.
-
-  - [bug] Fixes to the interpretation of the
-    Column "default" parameter as a callable
-    to not pass ExecutionContext into a keyword
-    argument parameter.  [ticket:2520]
-
-  - [bug] All of UniqueConstraint, ForeignKeyConstraint,
-    CheckConstraint, and PrimaryKeyConstraint will
-    attach themselves to their parent table automatically
-    when they refer to a Table-bound Column object directly
-    (i.e. not just string column name), and refer to
-    one and only one Table.   Prior to 0.8 this behavior
-    occurred for UniqueConstraint and PrimaryKeyConstraint,
-    but not ForeignKeyConstraint or CheckConstraint.
-    [ticket:2410]
-
-  - [bug] TypeDecorator now includes a generic repr()
-    that works in terms of the "impl" type by default.
-    This is a behavioral change for those TypeDecorator
-    classes that specify a custom __init__ method; those
-    types will need to re-define __repr__() if they need
-    __repr__() to provide a faithful constructor representation.
-    [ticket:2594]
-
-  - [bug] column.label(None) now produces an
-    anonymous label, instead of returning the
-    column object itself, consistent with the behavior
-    of label(column, None).  [ticket:2168]
-
-  - [feature] An explicit error is raised when
-    a ForeignKeyConstraint() that was
-    constructed to refer to multiple remote tables
-    is first used. [ticket:2455]
-
-- access
-  - [feature] the MS Access dialect has been
-    moved to its own project on Bitbucket,
-    taking advantage of the new SQLAlchemy
-    dialect compliance suite.   The dialect is
-    still in very rough shape and probably not
-    ready for general use yet, however
-    it does have *extremely* rudimental
-    functionality now.
-    https://bitbucket.org/zzzeek/sqlalchemy-access
-
-- maxdb
-  - [moved] The MaxDB dialect, which hasn't been
-    functional for several years, is
-    moved out to a pending bitbucket project,
-    https://bitbucket.org/zzzeek/sqlalchemy-maxdb.
-
-
-- sqlite
-  - [feature] the SQLite date and time types
-    have been overhauled to support a more open
-    ended format for input and output, using
-    name based format strings and regexps.  A
-    new argument "microseconds" also provides
-    the option to omit the "microseconds"
-    portion of timestamps.  Thanks to
-    Nathan Wright for the work and tests on
-    this.  [ticket:2363]
-
-- mssql
-  - [feature] SQL Server dialect can be given
-    database-qualified schema names,
-    i.e. "schema='mydatabase.dbo'"; reflection
-    operations will detect this, split the schema
-    among the "." to get the owner separately,
-    and emit a "USE mydatabase" statement before
-    reflecting targets within the "dbo" owner;
-    the existing database returned from
-    DB_NAME() is then restored.
-
-  - [bug] removed legacy behavior whereby
-    a column comparison to a scalar SELECT via
-    == would coerce to an IN with the SQL server
-    dialect.  This is implicit
-    behavior which fails in other scenarios
-    so is removed.  Code which relies on this
-    needs to be modified to use column.in_(select)
-    explicitly.  [ticket:2277]
-
-  - [feature] updated support for the mxodbc
-    driver; mxodbc 3.2.1 is recommended for full
-    compatibility.
-
-- postgresql
-
-  - [feature] postgresql.ARRAY features an optional
-    "dimension" argument, will assign a specific
-    number of dimensions to the array which will
-    render in DDL as ARRAY[][]..., also improves
-    performance of bind/result processing.
-    [ticket:2441]
-
-  - [feature] postgresql.ARRAY now supports
-    indexing and slicing.  The Python [] operator
-    is available on all SQL expressions that are
-    of type ARRAY; integer or simple slices can be
-    passed.  The slices can also be used on the
-    assignment side in the SET clause of an UPDATE
-    statement by passing them into Update.values();
-    see the docs for examples.
-
-  - [feature] Added new "array literal" construct
-    postgresql.array().  Basically a "tuple" that
-    renders as ARRAY[1,2,3].
-
-  - [feature] Added support for the Postgresql ONLY
-    keyword, which can appear corresponding to a
-    table in a SELECT, UPDATE, or DELETE statement.
-    The phrase is established using with_hint().
-    Courtesy Ryan Kelly [ticket:2506]
-
-  - [feature] The "ischema_names" dictionary of the
-    Postgresql dialect is "unofficially" customizable.
-    Meaning, new types such as PostGIS types can
-    be added into this dictionary, and the PG type
-    reflection code should be able to handle simple
-    types with variable numbers of arguments.
-    The functionality here is "unofficial" for
-    three reasons:
-
-    1. this is not an "official" API.  Ideally
-       an "official" API would allow custom type-handling
-       callables at the dialect or global level
-       in a generic way.
-    2. This is only implemented for the PG dialect,
-       in particular because PG has broad support
-       for custom types vs. other database backends.
-       A real API would be implemented at the
-       default dialect level.
-    3. The reflection code here is only tested against
-       simple types and probably has issues with more
-       compositional types.
-
-    patch courtesy Éric Lemoine.
-
-- firebird
-  - [feature] The "startswith()" operator renders
-    as "STARTING WITH", "~startswith()" renders
-    as "NOT STARTING WITH", using FB's more efficient
-    operator.  [ticket:2470]
-
-  - [bug] CompileError is raised when VARCHAR with
-    no length is attempted to be emitted, same
-    way as MySQL. [ticket:2505]
-
-  - [bug] Firebird now uses strict "ansi bind rules"
-    so that bound parameters don't render in the
-    columns clause of a statement - they render
-    literally instead.
-
-  - [bug] Support for passing datetime as date when
-    using the DateTime type with Firebird; other
-    dialects support this.
-
-  - [feature] An experimental dialect for the fdb
-    driver is added, but is untested as I cannot
-    get the fdb package to build.  [ticket:2504]
-
-- mysql
-  - [bug] Dialect no longer emits expensive server
-    collations query, as well as server casing,
-    on first connect.  These functions are still
-    available as semi-private. [ticket:2404]
-
-  - [feature] Added TIME type to mysql dialect,
-    accepts "fst" argument which is the new
-    "fractional seconds" specifier for recent
-    MySQL versions.  The datatype will interpret
-    a microseconds portion received from the driver,
-    however note that at this time most/all MySQL
-    DBAPIs do not support returning this value.
-    [ticket:2534]
-
-- oracle
-  - [bug] Quoting information is now passed along
-    from a Column with quote=True when generating
-    a same-named bound parameter to the bindparam()
-    object, as is the case in generated INSERT and UPDATE
-    statements, so that unknown reserved names can
-    be fully supported.  [ticket:2437]
-
-  - [feature] The types of columns excluded from the
-    setinputsizes() set can be customized by sending
-    a list of string DBAPI type names to exclude,
-    using the exclude_setinputsizes dialect parameter.
-    This list was previously fixed.  The list also
-    now defaults to STRING, UNICODE, removing
-    CLOB, NCLOB from the list.  [ticket:2561]
-
-  - [bug] The CreateIndex construct in Oracle
-    will now schema-qualify the name of the index
-    to be that of the parent table.  Previously this
-    name was omitted which apparently creates the
-    index in the default schema, rather than that
-    of the table.
-
-- extensions
-  - [removed] The SQLSoup extension is removed from
-    SQLAlchemy, and is now an external project.
-    See http://pypi.python.org/pypi/sqlsoup .
-    [ticket:2262]
-
-0.7.7 - 0.7.xx
-==============
-0.8 development begins during 0.7.7 development.
-All relevant bug fixes
-and features listed below from version 0.7.7 on
-are also present in 0.8.
-
-0.7.10
-======
-- orm
-  - [bug] Fixed Session accounting bug whereby replacing
-    a deleted object in the identity map with another
-    object of the same primary key would raise a
-    "conflicting state" error on rollback(),
-    if the replaced primary key were established either
-    via non-unitofwork-established INSERT statement
-    or by primary key switch of another instance.
-    [ticket:2583]
-
-- oracle
-  - [bug] changed the list of cx_oracle types that are
-    excluded from the setinputsizes() step to only include
-    STRING and UNICODE; CLOB and NCLOB are removed.  This
-    is to work around cx_oracle behavior which is broken
-    for the executemany() call.  In 0.8, this same change
-    is applied however it is also configurable via the
-    exclude_setinputsizes argument. [ticket:2561]
-
-- mysql
-  - [feature] Added "raise_on_warnings" flag to OurSQL
-    dialect.  [ticket:2523]
-
-  - [feature] Added "read_timeout" flag to MySQLdb
-    dialect.  [ticket:2554]
-
-0.7.9
 =====
-- orm
-  - [bug] Fixed bug mostly local to new
-    AbstractConcreteBase helper where the "type"
-    attribute from the superclass would not
-    be overridden on the subclass to produce the
-    "reserved for base" error message, instead placing
-    a do-nothing attribute there.  This was inconsistent
-    vs. using ConcreteBase as well as all the behavior
-    of classical concrete mappings, where the "type"
-    column from the polymorphic base would be explicitly
-    disabled on subclasses, unless overridden
-    explicitly.
-
-  - [bug] A warning is emitted when lazy='dynamic'
-    is combined with uselist=False.  This is an
-    exception raise in 0.8.
-
-  - [bug] Fixed bug whereby user error in related-object
-    assignment could cause recursion overflow if the
-    assignment triggered a backref of the same name
-    as a bi-directional attribute on the incorrect
-    class to the same target.  An informative
-    error is raised now.
-
-  - [bug] Fixed bug where incorrect type information
-    would be passed when the ORM would bind the
-    "version" column, when using the "version" feature.
-    Tests courtesy Daniel Miller.  [ticket:2539]
-
-  - [bug] Extra logic has been added to the "flush"
-    that occurs within Session.commit(), such that the
-    extra state added by an after_flush() or
-    after_flush_postexec() hook is also flushed in a
-    subsequent flush, before the "commit" completes.
-    Subsequent calls to flush() will continue until
-    the after_flush hooks stop adding new state.
-    An "overflow" counter of 100 is also in place,
-    in the event of a broken after_flush() hook
-    adding new content each time. [ticket:2566]
-
-- sql
-  - [bug] Fixed the DropIndex construct to support
-    an Index associated with a Table in a remote
-    schema. [ticket:2571]
-
-  - [bug] Fixed bug in over() construct whereby
-    passing an empty list for either partition_by
-    or order_by, as opposed to None, would fail
-    to generate correctly.
-    Courtesy Gunnlaugur Þór Briem.
-    [ticket:2574]
-
-  - [bug] Fixed CTE bug whereby positional
-    bound parameters present in the CTEs themselves
-    would corrupt the overall ordering of
-    bound parameters.  This primarily
-    affected SQL Server as the platform with
-    positional binds + CTE support.
-    [ticket:2521]
-
-  - [bug] Fixed more un-intuitivenesses in CTEs
-    which prevented referring to a CTE in a union
-    of itself without it being aliased.
-    CTEs now render uniquely
-    on name, rendering the outermost CTE of a given
-    name only - all other references are rendered
-    just as the name.   This even includes other
-    CTE/SELECTs that refer to different versions
-    of the same CTE object, such as a SELECT
-    or a UNION ALL of that SELECT. We are
-    somewhat loosening the usual link between object
-    identity and lexical identity in this case.
-    A true name conflict between two unrelated
-    CTEs now raises an error.
-
-  - [bug] quoting is applied to the column names
-    inside the WITH RECURSIVE clause of a
-    common table expression according to the
-    quoting rules for the originating Column.
-    [ticket:2512]
-
-  - [bug] Fixed regression introduced in 0.7.6
-    whereby the FROM list of a SELECT statement
-    could be incorrect in certain "clone+replace"
-    scenarios.  [ticket:2518]
-
-  - [bug] Fixed bug whereby usage of a UNION
-    or similar inside of an embedded subquery
-    would interfere with result-column targeting,
-    in the case that a result-column had the same
-    ultimate name as a name inside the embedded
-    UNION. [ticket:2552]
-
-  - [bug] Fixed a regression since 0.6 regarding
-    result-row targeting.   It should be possible
-    to use a select() statement with string
-    based columns in it, that is
-    select(['id', 'name']).select_from('mytable'),
-    and have this statement be targetable by
-    Column objects with those names; this is the
-    mechanism by which
-    query(MyClass).from_statement(some_statement)
-    works.  At some point the specific case of
-    using select(['id']), which is equivalent to
-    select([literal_column('id')]), stopped working
-    here, so this has been re-instated and of
-    course tested. [ticket:2558]
-
-  - [bug] Added missing operators is_(), isnot()
-    to the ColumnOperators base, so that these long-available
-    operators are present as methods like all
-    the other operators.  [ticket:2544]
-
-  - [bug] When the primary key column of a Table
-    is replaced, such as via extend_existing,
-    the "auto increment" column used by insert()
-    constructs is reset.  Previously it would
-    remain referring to the previous primary
-    key column.  [ticket:2525]
-
-- engine
-  - [bug] Fixed bug whereby
-    a disconnect detect + dispose that occurs
-    when the QueuePool has threads waiting
-    for connections would leave those
-    threads waiting for the duration of
-    the timeout on the old pool (or indefinitely
-    if timeout was disabled).   The fix
-    now notifies those waiters with a special
-    exception case and has them move onto
-    the new pool.  [ticket:2522]
-
-  - [feature] Dramatic improvement in memory
-    usage of the event system; instance-level
-    collections are no longer created for a
-    particular type of event until
-    instance-level listeners are established
-    for that event.  [ticket:2516]
-
-  - [bug] Added gaerdbms import to mysql/__init__.py,
-    the absense of which was preventing the new
-    GAE dialect from being loaded.  [ticket:2529]
-
-  - [bug] Fixed cextension bug whereby the
-    "ambiguous column error" would fail to
-    function properly if the given index were
-    a Column object and not a string.
-    Note there are still some column-targeting
-    issues here which are fixed in 0.8.
-    [ticket:2553]
-
-  - [bug] Fixed the repr() of Enum to include
-    the "name" and "native_enum" flags.  Helps
-    Alembic autogenerate.
-
-- sqlite
-  - [bug] Adjusted a very old bugfix which attempted
-    to work around a SQLite issue that itself was
-    "fixed" as of sqlite 3.6.14, regarding quotes
-    surrounding a table name when using
-    the "foreign_key_list" pragma.  The fix has been
-    adjusted to not interfere with quotes that
-    are *actually in the name* of a column or table,
-    to as much a degree as possible; sqlite still
-    doesn't return the correct result for foreign_key_list()
-    if the target table actually has quotes surrounding
-    its name, as *part* of its name (i.e. """mytable""").
-    [ticket:2568]
-
-  - [bug] Adjusted column default reflection code to
-    convert non-string values to string, to accommodate
-    old SQLite versions that don't deliver
-    default info as a string.  [ticket:2265]
-
-  - [feature] Added support for the localtimestamp()
-    SQL function implemented in SQLite, courtesy
-    Richard Mitchell.
-
-- postgresql
-  - [bug] Columns in reflected primary key constraint
-    are now returned in the order in which the constraint
-    itself defines them, rather than how the table
-    orders them.  Courtesy Gunnlaugur Þór Briem.
-    [ticket:2531].
-
-  - [bug] Added 'terminating connection' to the list
-    of messages we use to detect a disconnect with PG, which
-    appears to be present in some versions when the server
-    is restarted.  [ticket:2570]
-
-- mysql
-  - [bug] Updated mysqlconnector interface to use
-    updated "client flag" and "charset" APIs,
-    courtesy David McNelis.
-
-- mssql
-  - [bug] Fixed compiler bug whereby using a correlated
-    subquery within an ORDER BY would fail to render correctly
-    if the stament also used LIMIT/OFFSET, due to mis-rendering
-    within the ROW_NUMBER() OVER clause.  Fix courtesy
-    sayap [ticket:2538]
-
-  - [bug] Fixed compiler bug whereby a given
-    select() would be modified if it had an "offset"
-    attribute, causing the construct to not compile
-    correctly a second time.  [ticket:2545]
-
-  - [bug] Fixed bug where reflection of primary key constraint
-    would double up columns if the same constraint/table
-    existed in multiple schemas.
-
-0.7.8
-=====
-- orm
-  - [bug] Fixed bug whereby subqueryload() from
-    a polymorphic mapping to a target would incur
-    a new invocation of the query for each
-    distinct class encountered in the polymorphic
-    result.  [ticket:2480]
-
-  - [bug] Fixed bug in declarative
-    whereby the precedence of columns
-    in a joined-table, composite
-    column (typically for id) would fail to
-    be correct if the columns contained
-    names distinct from their attribute
-    names.  This would cause things like
-    primaryjoin conditions made against the
-    entity attributes to be incorrect.  Related
-    to [ticket:1892] as this was supposed
-    to be part of that, this is [ticket:2491].
-
-  - [feature] The 'objects' argument to
-    flush() is no longer deprecated, as some
-    valid use cases have been identified.
-
-  - [bug] Fixed identity_key() function which
-    was not accepting a scalar argument
-    for the identity.  [ticket:2508].
-
-  - [bug] Fixed bug whereby populate_existing
-    option would not propagate to subquery
-    eager loaders.  [ticket:2497].
-
-- sql
-  - [bug] added BIGINT to types.__all__,
-    BIGINT, BINARY, VARBINARY to sqlalchemy
-    module namespace, plus test to ensure
-    this breakage doesn't occur again.
-    [ticket:2499]
-
-  - [bug] Repaired common table expression
-    rendering to function correctly when the
-    SELECT statement contains UNION or other
-    compound expressions, courtesy btbuilder.
-    [ticket:2490]
-
-  - [bug] Fixed bug whereby append_column()
-    wouldn't function correctly on a cloned
-    select() construct, courtesy
-    Gunnlaugur Þór Briem.  [ticket:2482]
-
-- engine
-  - [bug] Fixed memory leak in C version of
-    result proxy whereby DBAPIs which don't deliver
-    pure Python tuples for result rows would
-    fail to decrement refcounts correctly.
-    The most prominently affected DBAPI
-    is pyodbc.  [ticket:2489]
-
-  - [bug] Fixed bug affecting Py3K whereby
-    string positional parameters passed to
-    engine/connection execute() would fail to be
-    interpreted correctly, due to __iter__
-    being present on Py3K string.
-    [ticket:2503].
-
-- postgresql
-  - [bug] removed unnecessary table clause when
-    reflecting enums, [ticket:2510].  Courtesy
-    Gunnlaugur Þór Briem.
-
-- oracle
-  - [bug] Added ROWID to oracle.*, [ticket:2483]
-
-- mysql
-  - [feature] Added a new dialect for Google App
-    Engine.  Courtesy Richie Foreman. [ticket:2484]
-
-
-0.7.7
-=====
-- orm
-  - [bug] Fixed issue in unit of work
-    whereby setting a non-None self-referential
-    many-to-one relationship to None
-    would fail to persist the change if the
-    former value was not already loaded.
-    [ticket:2477].
-
-  - [feature] Added prefix_with() method
-    to Query, calls upon select().prefix_with()
-    to allow placement of MySQL SELECT
-    directives in statements.  Courtesy
-    Diana Clarke [ticket:2443]
-
-  - [bug] Fixed bug in 0.7.6 introduced by
-    [ticket:2409] whereby column_mapped_collection
-    used against columns that were mapped as
-    joins or other indirect selectables
-    would fail to function.
-
-  - [feature] Added new flag to @validates
-    include_removes.  When True, collection
-    remove and attribute del events
-    will also be sent to the validation function,
-    which accepts an additional argument
-    "is_remove" when this flag is used.
-
-  - [bug] Fixed bug whereby polymorphic_on
-    column that's not otherwise mapped on the
-    class would be incorrectly included
-    in a merge() operation, raising an error.
-    [ticket:2449]
-
-  - [bug] Fixed bug in expression annotation
-    mechanics which could lead to incorrect
-    rendering of SELECT statements with aliases
-    and joins, particularly when using
-    column_property().  [ticket:2453]
-
-  - [bug] Fixed bug which would prevent
-    OrderingList from being pickleable
-    [ticket:2454].  Courtesy Jeff Dairiki
-
-  - [bug] Fixed bug in relationship comparisons
-    whereby calling unimplemented methods like
-    SomeClass.somerelationship.like() would
-    produce a recursion overflow, instead
-    of NotImplementedError.
-
-- sql
-  - [bug] Removed warning when Index is created
-    with no columns; while this might not be what
-    the user intended, it is a valid use case
-    as an Index could be a placeholder for just an
-    index of a certain name.
-
-  - [feature] Added new connection event
-    dbapi_error(). Is called for all DBAPI-level
-    errors passing the original DBAPI exception
-    before SQLAlchemy modifies the state
-    of the cursor.
-
-  - [bug] If conn.begin() fails when calling
-    "with engine.begin()", the newly acquired
-    Connection is closed explicitly before
-    propagating the exception onward normally.
-
-  - [bug] Add BINARY, VARBINARY to types.__all__,
-    [ticket:2474]
-
-- mssql
-  - [feature] Added interim create_engine flag
-    supports_unicode_binds to PyODBC dialect,
-    to force whether or not the dialect
-    passes Python unicode literals to PyODBC
-    or not.
-
-  - [bug] Repaired the use_scope_identity
-    create_engine() flag when using the pyodbc
-    dialect.  Previously this flag would be
-    ignored if set to False.  When set to False,
-    you'll get "SELECT @@identity" after each
-    INSERT to get at the last inserted ID,
-    for those tables which have "implicit_returning"
-    set to False.
-
-  - [bug] UPDATE..FROM syntax with SQL Server
-    requires that the updated table be present
-    in the FROM clause when an alias of that
-    table is also present in the FROM clause.
-    The updated table is now always present
-    in the FROM, when FROM is present
-    in the first place.  Courtesy sayap.
-    [ticket:2468]
-
-- postgresql
-  - [feature] Added new for_update/with_lockmode()
-    options for Postgresql: for_update="read"/
-    with_lockmode("read"),
-    for_update="read_nowait"/
-    with_lockmode("read_nowait").
-    These emit "FOR SHARE" and "FOR SHARE NOWAIT",
-    respectively.  Courtesy Diana Clarke
-    [ticket:2445]
-
-  - [bug] removed unnecessary table clause
-    when reflecting domains, [ticket:2473]
-
-- mysql
-  - [bug] Fixed bug whereby column name inside
-    of "KEY" clause for autoincrement composite
-    column with InnoDB would double quote a
-    name that's a reserved word.  Courtesy Jeff
-    Dairiki. [ticket:2460]
-
-  - [bug] Fixed bug whereby get_view_names() for
-    "information_schema" schema would fail
-    to retrieve views marked as "SYSTEM VIEW".
-    courtesy Matthew Turland.
-
-  - [bug] Fixed bug whereby if cast() is used
-    on a SQL expression whose type is not supported
-    by cast() and therefore CAST isn't rendered by
-    the dialect, the order of evaluation could change
-    if the casted expression required that it be
-    grouped; grouping is now applied to those
-    expressions.  [ticket:2467]
-
-- sqlite
-
-  - [feature] Added SQLite execution option
-    "sqlite_raw_colnames=True", will bypass
-    attempts to remove "." from column names
-    returned by SQLite cursor.description.
-    [ticket:2475]
-
-0.7.6
-=====
-- orm
-  - [bug] Fixed event registration bug
-    which would primarily show up as
-    events not being registered with
-    sessionmaker() instances created
-    after the event was associated
-    with the Session class.  [ticket:2424]
-
-  - [bug] Fixed bug whereby a primaryjoin
-    condition with a "literal" in it would
-    raise an error on compile with certain
-    kinds of deeply nested expressions
-    which also needed to render the same
-    bound parameter name more than once.
-    [ticket:2425]
-
-  - [feature] Added "no_autoflush" context
-    manager to Session, used with with:
-    will temporarily disable autoflush.
-
-  - [feature] Added cte() method to Query,
-    invokes common table expression support
-    from the Core (see below). [ticket:1859]
-
-  - [bug] Removed the check for number of
-    rows affected when doing a multi-delete
-    against mapped objects.   If an ON DELETE
-    CASCADE exists between two rows, we can't
-    get an accurate rowcount from the DBAPI;
-    this particular count is not supported
-    on most DBAPIs in any case, MySQLdb
-    is the notable case where it is.
-    [ticket:2403]
-
-  - [bug] Fixed bug whereby objects using
-    attribute_mapped_collection or
-    column_mapped_collection could not be
-    pickled.  [ticket:2409]
-
-  - [bug] Fixed bug whereby MappedCollection
-    would not get the appropriate collection
-    instrumentation if it were only used
-    in a custom subclass that used
-    @collection.internally_instrumented.
-    [ticket:2406]
-
-  - [bug] Fixed bug whereby SQL adaption mechanics
-    would fail in a very nested scenario involving
-    joined-inheritance, joinedload(), limit(), and a
-    derived function in the columns clause.
-    [ticket:2419]
-
-  - [bug] Fixed the repr() for CascadeOptions to
-    include refresh-expire.  Also reworked
-    CascadeOptions to be a <frozenset>.
-    [ticket:2417]
-
-  - [feature] Added the ability to query for
-    Table-bound column names when using
-    query(sometable).filter_by(colname=value).
-    [ticket:2400]
-
-  - [bug] Improved the "declarative reflection"
-    example to support single-table inheritance,
-    multiple calls to prepare(), tables that
-    are present in alternate schemas,
-    establishing only a subset of classes
-    as reflected.
-
-  - [bug] Scaled back the test applied within
-    flush() to check for UPDATE against partially
-    NULL PK within one table to only actually
-    happen if there's really an UPDATE to occur.
-    [ticket:2390]
-
-  - [bug] Fixed bug whereby if a method name
-    conflicted with a column name, a
-    TypeError would be raised when the mapper
-    tried to inspect the __get__() method
-    on the method object.  [ticket:2352]
-
-- sql
-  - [bug] Fixed memory leak in core which would
-    occur when C extensions were used with
-    particular types of result fetches,
-    in particular when orm query.count()
-    were called.  [ticket:2427]
-
-  - [bug] Fixed issue whereby attribute-based
-    column access on a row would raise
-    AttributeError with non-C version,
-    NoSuchColumnError with C version.  Now
-    raises AttributeError in both cases.
-    [ticket:2398]
-
-  - [feature] Added support for SQL standard
-    common table expressions (CTE), allowing
-    SELECT objects as the CTE source (DML
-    not yet supported).  This is invoked via
-    the cte() method on any select() construct.
-    [ticket:1859]
-
-  - [bug] Added support for using the .key
-    of a Column as a string identifier in a
-    result set row.   The .key is currently
-    listed as an "alternate" name for a column,
-    and is superseded by the name of a column
-    which has that key value as its regular name.
-    For the next major release
-    of SQLAlchemy we may reverse this precedence
-    so that .key takes precedence, but this
-    is not decided on yet.  [ticket:2392]
-
-  - [bug] A warning is emitted when a not-present
-    column is stated in the values() clause
-    of an insert() or update() construct.
-    Will move to an exception in 0.8.
-    [ticket:2413]
-
-  - [bug] A significant change to how labeling
-    is applied to columns in SELECT statements
-    allows "truncated" labels, that is label names
-    that are generated in Python which exceed
-    the maximum identifier length (note this is
-    configurable via label_length on create_engine()),
-    to be properly referenced when rendered inside
-    of a subquery, as well as to be present
-    in a result set row using their original
-    in-Python names.   [ticket:2396]
-
-  - [bug] Fixed bug in new "autoload_replace" flag
-    which would fail to preserve the primary
-    key constraint of the reflected table.
-    [ticket:2402]
-
-  - [bug] Index will raise when arguments passed
-    cannot be interpreted as columns or expressions.
-    Will warn when Index is created
-    with no columns at all.  [ticket:2380]
-
-- engine
-  - [feature] Added "no_parameters=True" execution
-    option for connections.   If no parameters
-    are present, will pass the statement
-    as cursor.execute(statement), thereby invoking
-    the DBAPIs behavior when no parameter collection
-    is present; for psycopg2 and mysql-python, this
-    means not interpreting % signs in the string.
-    This only occurs with this option, and not
-    just if the param list is blank, as otherwise
-    this would produce inconsistent behavior
-    of SQL expressions that normally escape percent
-    signs (and while compiling, can't know ahead of
-    time if parameters will be present in
-    some cases).  [ticket:2407]
-
-  - [bug] Added execution_options() call to
-    MockConnection (i.e., that used with
-    strategy="mock") which acts as a pass through
-    for arguments.
-
-  - [feature] Added pool_reset_on_return argument
-    to create_engine, allows control over
-    "connection return" behavior.  Also added
-    new arguments 'rollback', 'commit', None
-    to pool.reset_on_return to allow more control
-    over connection return activity. [ticket:2378]
-
-  - [feature] Added some decent context managers
-    to Engine, Connection:
-
-        with engine.begin() as conn:
-            <work with conn in a transaction>
-
-    and:
-
-        with engine.connect() as conn:
-            <work with conn>
-
-    Both close out the connection when done,
-    commit or rollback transaction with errors
-    on engine.begin().
-
-- sqlite
-  - [bug] Fixed bug in C extensions whereby
-    string format would not be applied to a
-    Numeric value returned as integer; this
-    affected primarily SQLite which does
-    not maintain numeric scale settings.
-    [ticket:2432]
-
-- mssql
-  - [feature] Added support for MSSQL INSERT,
-    UPDATE, and DELETE table hints, using
-    new with_hint() method on UpdateBase.
-    [ticket:2430]
-
-- mysql
-  - [feature] Added support for MySQL index and
-    primary key constraint types
-    (i.e. USING) via new mysql_using parameter
-    to Index and PrimaryKeyConstraint,
-    courtesy Diana Clarke.  [ticket:2386]
-
-  - [feature] Added support for the "isolation_level"
-    parameter to all MySQL dialects.  Thanks
-    to mu_mind for the patch here. [ticket:2394]
-
-- oracle
-  - [feature] Added a new create_engine() flag
-    coerce_to_decimal=False, disables the precision
-    numeric handling which can add lots of overhead
-    by converting all numeric values to
-    Decimal.  [ticket:2399]
-
-  - [bug] Added missing compilation support for
-    LONG [ticket:2401]
-
-  - [bug] Added 'LEVEL' to the list of reserved
-    words for Oracle.  [ticket:2435]
-
-- examples
-  - [bug] Altered _params_from_query() function
-    in Beaker example to pull bindparams from the
-    fully compiled statement, as a quick means
-    to get everything including subqueries in the
-    columns clause, etc.
-
-0.7.5 (January 28, 2012)
-=====
-- orm
-  - [bug] Fixed issue where modified session state
-    established after a failed flush would be committed
-    as part of the subsequent transaction that
-    begins automatically after manual call
-    to rollback().   The state of the session is
-    checked within rollback(), and if new state
-    is present, a warning is emitted and
-    restore_snapshot() is called a second time,
-    discarding those changes. [ticket:2389]
-
-  - [bug] Fixed regression from 0.7.4 whereby
-    using an already instrumented column from a
-    superclass as "polymorphic_on" failed to resolve
-    the underlying Column.  [ticket:2345]
-
-  - [bug] Raise an exception if xyzload_all() is
-    used inappropriately with two non-connected
-    relationships.  [ticket:2370]
-
-  - [feature] Added "class_registry" argument to
-    declarative_base().  Allows two or more declarative
-    bases to share the same registry of class names.
-
-  - [feature] query.filter() accepts multiple
-    criteria which will join via AND, i.e.
-    query.filter(x==y, z>q, ...)
-
-  - [feature] Added new capability to relationship
-    loader options to allow "default" loader strategies.
-    Pass '*' to any of joinedload(), lazyload(),
-    subqueryload(), or noload() and that becomes the
-    loader strategy used for all relationships,
-    except for those explicitly stated in the
-    Query.  Thanks to up-and-coming contributor
-    Kent Bower for an exhaustive and well
-    written test suite !  [ticket:2351]
-
-  - [bug] Fixed bug whereby event.listen(SomeClass)
-    forced an entirely unnecessary compile of the
-    mapper, making events very hard to set up
-    at module import time (nobody noticed this ??)
-    [ticket:2367]
-
-  - [bug] Fixed bug whereby hybrid_property didn't
-    work as a kw arg in any(), has().
-
-  - Fixed regression from 0.6 whereby if
-    "load_on_pending" relationship() flag were used
-    where a non-"get()" lazy clause needed to be
-    emitted on a pending object, it would fail
-    to load.
-
-  - [bug] ensure pickleability of all ORM exceptions
-    for multiprocessing compatibility. [ticket:2371]
-
-  - [bug] implemented standard "can't set attribute" /
-    "can't delete attribute" AttributeError when
-    setattr/delattr used on a hybrid that doesn't
-    define fset or fdel. [ticket:2353]
-
-  - [bug] Fixed bug where unpickled object didn't
-    have enough of its state set up to work
-    correctly within the unpickle() event established
-    by the mutable object extension, if the object
-    needed ORM attribute access within
-    __eq__() or similar. [ticket:2362]
-
-  - [bug] Fixed bug where "merge" cascade could
-    mis-interpret an unloaded attribute, if the
-    load_on_pending flag were used with
-    relationship().  Thanks to Kent Bower
-    for tests.  [ticket:2374]
-
-  - [feature] New declarative reflection example
-    added, illustrates how best to mix table reflection
-    with declarative as well as uses some new features
-    from [ticket:2356].
-
-- sql
-  - [feature] New reflection feature "autoload_replace";
-    when set to False on Table, the Table can be autoloaded
-    without existing columns being replaced.  Allows
-    more flexible chains of Table construction/reflection
-    to be constructed, including that it helps with
-    combining Declarative with table reflection.
-    See the new example on the wiki.  [ticket:2356]
-
-  - [bug] Improved the API for add_column() such that
-    if the same column is added to its own table,
-    an error is not raised and the constraints
-    don't get doubled up.  Also helps with some
-    reflection/declarative patterns. [ticket:2356]
-
-  - [feature] Added "false()" and "true()" expression
-    constructs to sqlalchemy.sql namespace, though
-    not part of __all__ as of yet.
-
-  - [feature] Dialect-specific compilers now raise
-    CompileException for all type/statement compilation
-    issues, instead of InvalidRequestError or ArgumentError.
-    The DDL for CREATE TABLE will re-raise
-    CompileExceptions to include table/column information
-    for the problematic column.  [ticket:2361]
-
-  - [bug] Fixed issue where the "required" exception
-    would not be raised for bindparam() with required=True,
-    if the statement were given no parameters at all.
-    [ticket:2381]
-
-- engine
-  - [bug] Added __reduce__ to StatementError,
-    DBAPIError, column errors so that exceptions
-    are pickleable, as when using multiprocessing.
-    However, not
-    all DBAPIs support this yet, such as
-    psycopg2. [ticket:2371]
-
-  - [bug] Improved error messages when a non-string
-    or invalid string is passed to any of the
-    date/time processors used by SQLite, including
-    C and Python versions.  [ticket:2382]
-
-  - [bug] Fixed bug whereby a table-bound Column
-    object named "<a>_<b>" which matched a column
-    labeled as "<tablename>_<colname>" could match
-    inappropriately when targeting in a result
-    set row.  [ticket:2377]
-
-  - [bug] Fixed bug in "mock" strategy whereby
-    correct DDL visit method wasn't called, resulting
-    in "CREATE/DROP SEQUENCE" statements being
-    duplicated [ticket:2384]
-
-- sqlite
-  - [bug] the "name" of an FK constraint in SQLite
-    is reflected as "None", not "0" or other
-    integer value [ticket:2364].
-    SQLite does not appear to support constraint
-    naming in any case.
-
-  - [bug] sql.false() and sql.true() compile to
-    0 and 1, respectively in sqlite [ticket:2368]
-
-  - [bug] removed an erroneous "raise" in the
-    SQLite dialect when getting table names
-    and view names, where logic is in place
-    to fall back to an older version of
-    SQLite that doesn't have the
-    "sqlite_temp_master" table.
-
-- mysql
-  - [bug] fixed regexp that filters out warnings
-    for non-reflected "PARTITION" directives,
-    thanks to George Reilly [ticket:2376]
-
-- mssql
-  - [bug] Adjusted the regexp used in the
-    mssql.TIME type to ensure only six digits
-    are received for the "microseconds" portion
-    of the value, which is expected by
-    Python's datetime.time().  Note that
-    support for sending microseconds doesn't
-    seem to be possible yet with pyodbc
-    at least.  [ticket:2340]
-
-  - [bug] Dropped the "30 char" limit on pymssql,
-    based on reports that it's doing things
-    better these days.  pymssql hasn't been
-    well tested and as the DBAPI is in flux
-    it's still not clear what the status
-    is on this driver and how SQLAlchemy's
-    implementation should adapt.  [ticket:2347]
-
-- oracle
-  - [bug] Added ORA-03135 to the never ending
-    list of oracle "connection lost" errors
-    [ticket:2388]
-
-- core
-  - [bug] Changed LRUCache, used by the mapper
-    to cache INSERT/UPDATE/DELETE statements,
-    to use an incrementing counter instead
-    of a timestamp to track entries, for greater
-    reliability versus using time.time(), which
-    can cause test failures on some platforms.
-    [ticket:2379]
-
-  - [bug] Added a boolean check for the "finalize"
-    function within the pool connection proxy's
-    weakref callback before calling it, so that a
-    warning isn't emitted that this function is None
-    when the application is exiting and gc has
-    removed the function from the module before the
-    weakref callback was invoked.  [ticket:2383]
-
-- Py3K
-  - [bug] Fixed inappropriate usage of util.py3k
-    flag and renamed it to util.py3k_warning, since
-    this flag is intended to detect the -3 flag
-    series of import restrictions only.
-    [ticket:2348]
-
-- examples
-  - [feature] Simplified the versioning example
-    a bit to use a declarative mixin as well
-    as an event listener, instead of a metaclass +
-    SessionExtension.  [ticket:2313]
-
-  - [bug] Fixed large_collection.py to close the
-    session before dropping tables. [ticket:2346]
-
-0.7.4 (December 9, 2011)
-=====
-- orm
-  - [bug] Fixed backref behavior when "popping" the
-    value off of a many-to-one in response to
-    a removal from a stale one-to-many - the operation
-    is skipped, since the many-to-one has since
-    been updated.  [ticket:2315]
-
-  - [bug] After some years of not doing this, added
-    more granularity to the "is X a parent of Y"
-    functionality, which is used when determining
-    if the FK on "Y" needs to be "nulled out" as well
-    as if "Y" should be deleted with delete-orphan
-    cascade.   The test now takes into account the
-    Python identity of the parent as well its identity
-    key, to see if the last known parent of Y is
-    definitely X.   If a decision
-    can't be made, a StaleDataError is raised.  The
-    conditions where this error is raised are fairly
-    rare, requiring that the previous parent was
-    garbage collected, and previously
-    could very well inappropriately update/delete
-    a record that's since moved onto a new parent,
-    though there may be some cases where
-    "silent success" occurred previously that will now
-    raise in the face of ambiguity.
-    Expiring "Y" resets the "parent" tracker, meaning
-    X.remove(Y) could then end up deleting Y even
-    if X is stale, but this is the same behavior
-    as before; it's advised to expire X also in that
-    case.  [ticket:2264]
-
-  - [bug] fixed inappropriate evaluation of user-mapped
-    object in a boolean context within query.get()
-    [ticket:2310].  Also in 0.6.9.
-
-  - [bug] Added missing comma to PASSIVE_RETURN_NEVER_SET
-    symbol [ticket:2304]
-
-  - [bug] Cls.column.collate("some collation") now
-    works.  [ticket:1776]  Also in 0.6.9
-
-  - [bug] the value of a composite attribute is now
-    expired after an insert or update operation, instead
-    of regenerated in place.  This ensures that a
-    column value which is expired within a flush
-    will be loaded first, before the composite
-    is regenerated using that value.  [ticket:2309]
-
-  - [bug] The fix in [ticket:2309] also emits the
-    "refresh" event when the composite value is
-    loaded on access, even if all column
-    values were already present, as is appropriate.
-    This fixes the "mutable" extension which relies
-    upon the "load" event to ensure the _parents
-    dictionary is up to date, fixes [ticket:2308].
-    Thanks to Scott Torborg for the test case here.
-
-  - [bug] Fixed bug whereby a subclass of a subclass
-    using concrete inheritance in conjunction with
-    the new ConcreteBase or AbstractConcreteBase
-    would fail to apply the subclasses deeper than
-    one level to the "polymorphic loader" of each
-    base  [ticket:2312]
-
-  - [bug] Fixed bug whereby a subclass of a subclass
-    using the new AbstractConcreteBase would fail
-    to acquire the correct "base_mapper" attribute
-    when the "base" mapper was generated, thereby
-    causing failures later on.  [ticket:2312]
-
-  - [bug] Fixed bug whereby column_property() created
-    against ORM-level column could be treated as
-    a distinct entity when producing certain
-    kinds of joined-inh joins.  [ticket:2316]
-
-  - [bug] Fixed the error formatting raised when
-    a tuple is inadvertently passed to session.query()
-    [ticket:2297].  Also in 0.6.9.
-
-  - [bug] Calls to query.join() to a single-table
-    inheritance subclass are now tracked, and
-    are used to eliminate the additional WHERE..
-    IN criterion normally tacked on with single
-    table inheritance, since the join should
-    accommodate it.  This allows OUTER JOIN
-    to a single table subclass to produce
-    the correct results, and overall will produce
-    fewer WHERE criterion when dealing with
-    single table inheritance joins.
-    [ticket:2328]
-
-  - [bug] __table_args__ can now be passed as
-    an empty tuple as well as an empty dict.
-    [ticket:2339].  Thanks to Fayaz Yusuf Khan
-    for the patch.
-
-  - [bug] Updated warning message when setting
-    delete-orphan without delete to no longer
-    refer to 0.6, as we never got around to
-    upgrading this to an exception.  Ideally
-    this might be better as an exception but
-    it's not critical either way.  [ticket:2325]
-
-  - [feature] polymorphic_on now accepts many
-    new kinds of values:
-
-      - standalone expressions that aren't
-        otherwise mapped
-      - column_property() objects
-      - string names of any column_property()
-        or attribute name of a mapped Column
-
-    The docs include an example using
-    the case() construct, which is likely to be
-    a common constructed used here.
-    [ticket:2345] and part of [ticket:2238]
-
-    Standalone expressions in polymorphic_on
-    propagate to single-table inheritance
-    subclasses so that they are used in the
-    WHERE /JOIN clause to limit rows to that
-    subclass as is the usual behavior.
-
-  - [feature] IdentitySet supports the - operator
-    as the same as difference(), handy when dealing
-    with Session.dirty etc. [ticket:2301]
-
-  - [feature] Added new value for Column autoincrement
-    called "ignore_fk", can be used to force autoincrement
-    on a column that's still part of a ForeignKeyConstraint.
-    New example in the relationship docs illustrates
-    its use.
-
-  - [bug] Fixed bug in get_history() when referring
-    to a composite attribute that has no value;
-    added coverage for get_history() regarding
-    composites which is otherwise just a userland
-    function.
-
-- sql
-   - [bug] related to [ticket:2316], made some
-     adjustments to the change from [ticket:2261]
-     regarding the "from" list on a select(). The
-     _froms collection is no longer memoized, as this
-     simplifies various use cases and removes the
-     need for a "warning" if a column is attached
-     to a table after it was already used in an
-     expression - the select() construct will now
-     always produce the correct expression.
-     There's probably no real-world
-     performance hit here; select() objects are
-     almost always made ad-hoc, and systems that
-     wish to optimize the re-use of a select()
-     would be using the "compiled_cache" feature.
-     A hit which would occur when calling select.bind
-     has been reduced, but the vast majority
-     of users shouldn't be using "bound metadata"
-     anyway :).
-
-   - [feature] The update() construct can now accommodate
-     multiple tables in the WHERE clause, which will
-     render an "UPDATE..FROM" construct, recognized by
-     Postgresql and MSSQL.  When compiled on MySQL,
-     will instead generate "UPDATE t1, t2, ..".  MySQL
-     additionally can render against multiple tables in the
-     SET clause, if Column objects are used as keys
-     in the "values" parameter or generative method.
-     [ticket:2166] [ticket:1944]
-
-   - [feature] Added accessor to types called "python_type",
-     returns the rudimentary Python type object
-     for a particular TypeEngine instance, if known,
-     else raises NotImplementedError.  [ticket:77]
-
-   - [bug] further tweak to the fix from [ticket:2261],
-     so that generative methods work a bit better
-     off of cloned (this is almost a non-use case though).
-     In particular this allows with_only_columns()
-     to behave more consistently.   Added additional
-     documentation to with_only_columns() to clarify
-     expected behavior, which changed as a result
-     of [ticket:2261].  [ticket:2319]
-
-- engine
-  - [bug] Fixed bug whereby transaction.rollback()
-    would throw an error on an invalidated
-    connection if the transaction were a
-    two-phase or savepoint transaction.
-    For plain transactions, rollback() is a no-op
-    if the connection is invalidated, so while
-    it wasn't 100% clear if it should be a no-op,
-    at least now the interface is consistent.
-    [ticket:2317]
-
-- schema
-  - [feature] Added new support for remote "schemas":
-    - MetaData() accepts "schema" and "quote_schema"
-      arguments, which will be applied to the same-named
-      arguments of a Table
-      or Sequence which leaves these at their default
-      of ``None``.
-    - Sequence accepts "quote_schema" argument
-    - tometadata() for Table will use the "schema"
-      of the incoming MetaData for the new Table
-      if the schema argument is explicitly "None"
-    - Added CreateSchema and DropSchema DDL
-      constructs - these accept just the string
-      name of a schema and a "quote" flag.
-    - When using default "schema" with MetaData,
-      ForeignKey will also assume the "default" schema
-      when locating remote table.  This allows the "schema"
-      argument on MetaData to be applied to any
-      set of Table objects that otherwise don't have
-      a "schema".
-    - a "has_schema" method has been implemented
-      on dialect, but only works on Postgresql so far.
-    Courtesy Manlio Perillo, [ticket:1679]
-
-  - [feature] The "extend_existing" flag on Table
-    now allows for the reflection process to take
-    effect for a Table object that's already been
-    defined; when autoload=True and extend_existing=True
-    are both set, the full set of columns will be
-    reflected from the Table which will then
-    *overwrite* those columns already present,
-    rather than no activity occurring.  Columns that
-    are present directly in the autoload run
-    will be used as always, however.
-    [ticket:1410]
-
-  - [bug] Fixed bug whereby TypeDecorator would
-    return a stale value for _type_affinity, when
-    using a TypeDecorator that "switches" types,
-    like the CHAR/UUID type.
-
-  - [bug] Fixed bug whereby "order_by='foreign_key'"
-    option to Inspector.get_table_names
-    wasn't implementing the sort properly, replaced
-    with the existing sort algorithm
-
-  - [bug] the "name" of a column-level CHECK constraint,
-    if present, is now rendered in the CREATE TABLE
-    statement using "CONSTRAINT <name> CHECK <expression>".
-    [ticket:2305]
-
-- pyodbc
-   - [bug] pyodbc-based dialects now parse the
-     pyodbc accurately as far as observed
-     pyodbc strings, including such gems
-     as "py3-3.0.1-beta4" [ticket:2318]
-
-- postgresql
-   - [bug] Postgresql dialect memoizes that an ENUM of a
-     particular name was processed
-     during a create/drop sequence.  This allows
-     a create/drop sequence to work without any
-     calls to "checkfirst", and also means with
-     "checkfirst" turned on it only needs to
-     check for the ENUM once.  [ticket:2311]
-
-   - [feature] Added create_type constructor argument
-     to pg.ENUM.  When False, no CREATE/DROP or
-     checking for the type will be performed as part
-     of a table create/drop event; only the
-     create()/drop)() methods called directly
-     will do this.  Helps with Alembic "offline"
-     scripts.
-
-- mssql
-  - [feature] lifted the restriction on SAVEPOINT
-    for SQL Server.  All tests pass using it,
-    it's not known if there are deeper issues
-    however.   [ticket:822]
-
-  - [bug] repaired the with_hint() feature which
-    wasn't implemented correctly on MSSQL -
-    usually used for the "WITH (NOLOCK)" hint
-    (which you shouldn't be using anyway !
-    use snapshot isolation instead :) )
-    [ticket:2336]
-
-  - [bug] use new pyodbc version detection for
-    _need_decimal_fix option, [ticket:2318]
-
-  - [bug] don't cast "table name" as NVARCHAR
-    on SQL Server 2000.  Still mostly in the dark
-    what incantations are needed to make PyODBC
-    work fully with FreeTDS 0.91 here, however.
-    [ticket:2343]
-
-  - [bug] Decode incoming values when retrieving
-    list of index names and the names of columns
-    within those indexes.  [ticket:2269]
-
-- mysql
-  - [bug] Unicode adjustments allow latest pymysql
-    (post 0.4) to pass 100% on Python 2.
-
-- ext
-   - [feature] Added an example to the hybrid docs
-     of a "transformer" - a hybrid that returns a
-     query-transforming callable in combination
-     with a custom comparator.   Uses a new method
-     on Query called with_transformation().  The use
-     case here is fairly experimental, but only
-     adds one line of code to Query.
-
-   - [bug] the @compiles decorator raises an
-     informative error message when no "default"
-     compilation handler is present, rather
-     than KeyError.
-
-- examples
-   - [bug] Fixed bug in history_meta.py example where
-     the "unique" flag was not removed from a
-     single-table-inheritance subclass which
-     generates columns to put up onto the base.
-
-0.7.3
-=====
-- general
-   - Adjusted the "importlater" mechanism, which is
-     used internally to resolve import cycles,
-     such that the usage of __import__ is completed
-     when the import of sqlalchemy or sqlalchemy.orm
-     is done, thereby avoiding any usage of __import__
-     after the application starts new threads,
-     fixes [ticket:2279].  Also in 0.6.9.
-
-- orm
-   - Improved query.join() such that the "left" side
-     can more flexibly be a non-ORM selectable,
-     such as a subquery.   A selectable placed
-     in select_from() will now be used as the left
-     side, favored over implicit usage
-     of a mapped entity.
-     If the join still fails based on lack of
-     foreign keys, the error message includes
-     this detail.  Thanks to brianrhude
-     on IRC for the test case.  [ticket:2298]
-
-   - Added after_soft_rollback() Session event.  This
-     event fires unconditionally whenever rollback()
-     is called, regardless of if an actual DBAPI
-     level rollback occurred.  This event
-     is specifically designed to allow operations
-     with the Session to proceed after a rollback
-     when the Session.is_active is True.
-     [ticket:2241]
-
-  - added "adapt_on_names" boolean flag to orm.aliased()
-    construct.  Allows an aliased() construct
-    to link the ORM entity to a selectable that contains
-    aggregates or other derived forms of a particular
-    attribute, provided the name is the same as that
-    of the entity mapped column.
-
-  - Added new flag expire_on_flush=False to column_property(),
-    marks those properties that would otherwise be considered
-    to be "readonly", i.e. derived from SQL expressions,
-    to retain their value after a flush has occurred, including
-    if the parent object itself was involved in an update.
-
-  - Enhanced the instrumentation in the ORM to support
-    Py3K's new argument style of "required kw arguments",
-    i.e. fn(a, b, *, c, d), fn(a, b, *args, c, d).
-    Argument signatures of mapped object's __init__
-    method will be preserved, including required kw rules.
-    [ticket:2237]
-
-  - Fixed bug in unit of work whereby detection of
-    "cycles" among classes in highly interlinked patterns
-    would not produce a deterministic
-    result; thereby sometimes missing some nodes that
-    should be considered cycles and causing further
-    issues down the road.  Note this bug is in 0.6
-    also; not backported at the moment.
-    [ticket:2282]
-
-  - Fixed a variety of synonym()-related regressions
-    from 0.6:
-        - making a synonym against a synonym now works.
-        - synonyms made against a relationship() can
-          be passed to query.join(), options sent
-          to query.options(), passed by name
-          to query.with_parent().
-
-  - Fixed bug whereby mapper.order_by attribute would
-    be ignored in the "inner" query within a
-    subquery eager load.  [ticket:2287].
-    Also in 0.6.9.
-
-  - Identity map .discard() uses dict.pop(,None)
-    internally instead of "del" to avoid KeyError/warning
-    during a non-determinate gc teardown [ticket:2267]
-
-  - Fixed regression in new composite rewrite where
-    deferred=True option failed due to missing
-    import [ticket:2253]
-
-  - Reinstated "comparator_factory" argument to
-    composite(), removed when 0.7 was released.
-    [ticket:2248]
-
-  - Fixed bug in query.join() which would occur
-    in a complex multiple-overlapping path scenario,
-    where the same table could be joined to
-    twice.  Thanks *much* to Dave Vitek
-    for the excellent fix here.  [ticket:2247]
-
-  - Query will convert an OFFSET of zero when
-    slicing into None, so that needless OFFSET
-    clauses are not invoked.
-
-  - Repaired edge case where mapper would fail
-    to fully update internal state when a relationship
-    on a new mapper would establish a backref on the
-    first mapper.
-
-  - Fixed bug whereby if __eq__() was
-    redefined, a relationship many-to-one lazyload
-    would hit the __eq__() and fail.  [ticket:2260]
-    Does not apply to 0.6.9.
-
-  - Calling class_mapper() and passing in an object
-    that is not a "type" (i.e. a class that could
-    potentially be mapped) now raises an informative
-    ArgumentError, rather than UnmappedClassError.
-    [ticket:2196]
-
-  - New event hook, MapperEvents.after_configured().
-    Called after a configure() step has completed and
-    mappers were in fact affected.   Theoretically this
-    event is called once per application, unless new mappings
-    are constructed after existing ones have been used
-    already.
-
-  - When an open Session is garbage collected, the objects
-    within it which remain are considered detached again
-    when they are add()-ed to a new Session.
-    This is accomplished by an extra check that the previous
-    "session_key" doesn't actually exist among the pool
-    of Sessions.  [ticket:2281]
-
-  - New declarative features:
-        - __declare_last__() method, establishes an event
-        listener for the class method that will be called
-        when mappers are completed with the final "configure"
-        step.
-        - __abstract__ flag.   The class will not be mapped
-        at all when this flag is present on the class.
-        - New helper classes ConcreteBase, AbstractConcreteBase.
-        Allow concrete mappings using declarative which automatically
-        set up the "polymorphic_union" when the "configure"
-        mapper step is invoked.
-        - The mapper itself has semi-private methods that allow
-        the "with_polymorphic" selectable to be assigned
-        to the mapper after it has already been configured.
-        [ticket:2239]
-
-   - Declarative will warn when a subclass' base uses
-     @declared_attr for a regular column - this attribute
-     does not propagate to subclasses. [ticket:2283]
-
-   - The integer "id" used to link a mapped instance with
-     its owning Session is now generated by a sequence
-     generation function rather than id(Session), to
-     eliminate the possibility of recycled id() values
-     causing an incorrect result, no need to check that
-     object actually in the session.  [ticket:2280]
-
--sql
-  - Behavioral improvement: empty
-    conjunctions such as and_() and or_() will be
-    flattened in the context of an enclosing conjunction,
-    i.e. and_(x, or_()) will produce 'X' and not 'X AND
-    ()'. [ticket:2257].
-
-  - Fixed bug regarding calculation of "from" list
-    for a select() element.  The "from" calc is now
-    delayed, so that if the construct uses a Column
-    object that is not yet attached to a Table,
-    but is later associated with a Table, it generates
-    SQL using the table as a FROM.   This change
-    impacted fairly deeply the mechanics of how
-    the FROM list as well as the "correlates" collection
-    is calculated, as some "clause adaption" schemes
-    (these are used very heavily in the ORM)
-    were relying upon the fact that the "froms"
-    collection would typically be cached before the
-    adaption completed.   The rework allows it
-    such that the "froms" collection can be cleared
-    and re-generated at any time.  [ticket:2261]
-
-  - Fixed bug whereby with_only_columns() method of
-    Select would fail if a selectable were passed.
-    [ticket:2270].  Also in 0.6.9.
-
-- schema
-  - Modified Column.copy() to use _constructor(),
-    which defaults to self.__class__, in order to
-    create the new object.  This allows easier support
-    of subclassing Column.  [ticket:2284]
-
-  - Added a slightly nicer __repr__() to SchemaItem
-    classes.  Note the repr here can't fully support
-    the "repr is the constructor" idea since schema
-    items can be very deeply nested/cyclical, have
-    late initialization of some things, etc.
-    [ticket:2223]
-
-- engine
-  - The recreate() method in all pool classes uses
-    self.__class__ to get at the type of pool
-    to produce, in the case of subclassing.  Note
-    there's no usual need to subclass pools.
-    [ticket:2254]
-
-  - Improvement to multi-param statement logging,
-    long lists of bound parameter sets will be
-    compressed with an informative indicator
-    of the compression taking place.  Exception
-    messages use the same improved formatting.
-    [ticket:2243]
-
-  - Added optional "sa_pool_key" argument to
-    pool.manage(dbapi).connect() so that serialization
-    of args is not necessary.
-
-  - The entry point resolution supported by
-    create_engine() now supports resolution of
-    individual DBAPI drivers on top of a built-in
-    or entry point-resolved dialect, using the
-    standard '+' notation - it's converted to
-    a '.' before being resolved as an entry
-    point.  [ticket:2286]
-
-  - Added an exception catch + warning for the
-    "return unicode detection" step within connect,
-    allows databases that crash on NVARCHAR to
-    continue initializing, assuming no NVARCHAR
-    type implemented.  [ticket:2299]
-
-- types
-  - Extra keyword arguments to the base Float
-    type beyond "precision" and "asdecimal" are ignored;
-    added a deprecation warning here and additional
-    docs, related to [ticket:2258]
-
-- sqlite
-  - Ensured that the same ValueError is raised for
-    illegal date/time/datetime string parsed from
-    the database regardless of whether C
-    extensions are in use or not.
-
-- postgresql
-  - Added "postgresql_using" argument to Index(), produces
-    USING clause to specify index implementation for
-    PG.  [ticket:2290].  Thanks to Ryan P. Kelly for
-    the patch.
-
-  - Added client_encoding parameter to create_engine()
-    when the postgresql+psycopg2 dialect is used;
-    calls the psycopg2 set_client_encoding() method
-    with the value upon connect.  [ticket:1839]
-
-  - Fixed bug related to [ticket:2141] whereby the
-    same modified index behavior in PG 9 affected
-    primary key reflection on a renamed column.
-    [ticket:2291].  Also in 0.6.9.
-
-  - Reflection functions for Table, Sequence no longer
-    case insensitive.  Names can be differ only in case
-    and will be correctly distinguished.  [ticket:2256]
-
-  - Use an atomic counter as the "random number"
-    source for server side cursor names;
-    conflicts have been reported in rare cases.
-
-  - Narrowed the assumption made when reflecting
-    a foreign-key referenced table with schema in
-    the current search path; an explicit schema will
-    be applied to the referenced table only if
-    it actually matches that of the referencing table,
-    which also has an explicit schema.   Previously
-    it was assumed that "current" schema was synonymous
-    with the full search_path.  [ticket:2249]
-
-- mysql
-  - a CREATE TABLE will put the COLLATE option
-    after CHARSET, which appears to be part of
-    MySQL's arbitrary rules regarding if it will actually
-    work or not.  [ticket:2225]  Also in 0.6.9.
-
-  - Added mysql_length parameter to Index construct,
-    specifies "length" for indexes.  [ticket:2293]
-
-- mssql
-  - Changes to attempt support of FreeTDS 0.91 with
-    Pyodbc.  This includes that string binds are sent as
-    Python unicode objects when FreeTDS 0.91 is detected,
-    and a CAST(? AS NVARCHAR) is used when we detect
-    for a table.   However, I'd continue
-    to characterize Pyodbc + FreeTDS 0.91 behavior as
-    pretty crappy, there are still many queries such
-    as used in reflection which cause a core dump on
-    Linux, and it is not really usable at all
-    on OSX, MemoryErrors abound and just plain broken
-    unicode support.   [ticket:2273]
-
-  - The behavior of =/!= when comparing a scalar select
-    to a value will no longer produce IN/NOT IN as of 0.8;
-    this behavior is a little too heavy handed (use in_() if
-    you want to emit IN) and now emits a deprecation warning.
-    To get the 0.8 behavior immediately and remove the warning,
-    a compiler recipe is given at
-    http://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons
-    to override the behavior of visit_binary().
-    [ticket:2277]
-
-  - "0" is accepted as an argument for limit() which
-    will produce "TOP 0". [ticket:2222]
-
-- oracle
-  - Fixed ReturningResultProxy for zxjdbc dialect.
-    [ticket:2272].  Regression from 0.6.
-
-  - The String type now generates VARCHAR2 on Oracle
-    which is recommended as the default VARCHAR.
-    Added an explicit VARCHAR2 and NVARCHAR2 to the Oracle
-    dialect as well.   Using NVARCHAR still generates
-    "NVARCHAR2" - there is no "NVARCHAR" on Oracle -
-    this remains a slight breakage of the "uppercase types
-    always give exactly that" policy.  VARCHAR still
-    generates "VARCHAR", keeping with the policy.   If
-    Oracle were to ever define "VARCHAR" as something
-    different as they claim (IMHO this will never happen),
-    the type would be available.  [ticket:2252]
-
-- ext
-  - SQLSoup will not be included in version 0.8
-    of SQLAlchemy; while useful, we would like to
-    keep SQLAlchemy itself focused on one ORM
-    usage paradigm.  SQLSoup will hopefully
-    soon be superseded by a third party
-    project.  [ticket:2262]
-
-  - Added local_attr, remote_attr, attr accessors
-    to AssociationProxy, providing quick access
-    to the proxied attributes at the class
-    level. [ticket:2236]
-
-  - Changed the update() method on association proxy
-    dictionary to use a duck typing approach, i.e.
-    checks for "keys", to discern between update({})
-    and update((a, b)).   Previously, passing a
-    dictionary that had tuples as keys would be misinterpreted
-    as a sequence. [ticket:2275]
-
-- examples
-  - Adjusted dictlike-polymorphic.py example
-    to apply the CAST such that it works on
-    PG, other databases.  [ticket:2266]
-    Also in 0.6.9.
-
-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