Anonymous avatar Anonymous committed 350a395 Draft Merge

merged 0_8

Comments (0)

Files changed (455)

 .so$
 .egg-info
 .*,cover
+^dogpile_data/
 .un~
 \.coverage
 \.DS_Store
 19a7e3a6058878ecc07a40ea563e9cf92110be3a rel_0_7_4
 ebe9514a69a4b4ec6209f0e9aa43053ba28d080b rel_0_7_5
 d557287431986274a796348750f1c6ce885b196c rel_0_7_6
+6495bcf87e10461675d8905d62f5632e634ec33c rel_0_8_0b1
+8d82961d34643c8d53d865ddf76911807a36fde6 rel_0_8_8b2
--*- 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]
-
-  - [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]
-
-  - [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] 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]
-
-  - [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]
-
-  - [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]
-
-  - [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
-  - [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.   The fix
-    now notifies those waiters with a special
-    exception case and has them move onto
-    the new pool.  This fix may or may
-    not be ported to 0.7.  [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]
-
-  - [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]
-
-  - ResultProxy.last_inserted_ids is removed,
-    replaced by inserted_primary_key.
-
-- sql
-  - [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]
-
-  - [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.
-
-  - [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] 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]
-
-- 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
-  - [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]
-
-- 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] 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]
-
-
-- 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]
-
-- 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]
-
-- 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.9
 =====
-- sql
-  - [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]
-
-- engine
-  - [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]
-
-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
-    loads/cycles for an already-loaded graph). For a
-    subqueryload, this means that the additional
-    SELECT statements emitted by subqueryload will
-    invoke unconditionally, no matter how much of the
-    existing graph is already present (hence the
-    controversy). The previous behavior of "stopping"
-