0.3.7 is out and has a huge number of improvements and fixes.  some  
of the highlights:

- server side cursor support for Postgres
- much improved auto-reconnect support
- informix support
- long identifier name support
- support for unicode table/column/identifier names and SQL statements
- deterministic label name generation
- new query features, like with_parent()
- improvements to custom collection mapping
- lots more docstrings
- major refactoring of sqlalchemy.engine internals, featuring clearer
structural relationships, fewer codepaths, better result handling

Get the latest version of SQLAlchemy via setuptools or at:

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


changelog:

- engines
- warnings module used for issuing warnings (instead of logging)
- cleanup of DBAPI import strategies across all engines
   [ticket:480]
- refactoring of engine internals which reduces complexity,
   number of codepaths; places more state inside of ExecutionContext
   to allow more dialect control of cursor handling, result sets.
   ResultProxy totally refactored and also has two versions of
   "buffered" result sets used for different purposes.
- server side cursor support fully functional in postgres
   [ticket:514].
- improved framework for auto-invalidation of connections that have
   lost their underlying database, via dialect-specific detection
   of exceptions corresponding to that database's disconnect
   related error messages.  Additionally, when a "connection no
   longer open" condition is detected, the entire connection pool
   is discarded and replaced with a new instance.  #516
- the dialects within sqlalchemy.databases become a setuptools
   entry points. loading the built-in database dialects works the
   same as always, but if none found will fall back to trying
   pkg_resources to load an external module [ticket:521]
- Engine contains a "url" attribute referencing the url.URL object
   used by create_engine().

- sql:
- keys() of result set columns are not lowercased, come back
   exactly as they're expressed in cursor.description.  note this
   causes colnames to be all caps in oracle.
- preliminary support for unicode table names, column names and
   SQL statements added, for databases which can support them.
   Works with sqlite and postgres so far.  Mysql *mostly* works
   except the has_table() function does not work.  Reflection
   works too.
- the Unicode type is now a direct subclass of String, which now
   contains all the "convert_unicode" logic.  This helps the variety
   of unicode situations that occur in db's such as MS-SQL to be
   better handled and allows subclassing of the Unicode datatype.
   [ticket:522]
- ClauseElements can be used in in_() clauses now, such as bind
   parameters, etc. #476
- reverse operators implemented for `CompareMixin` elements,
   allows expressions like "5 + somecolumn" etc. #474
- the "where" criterion of an update() and delete() now correlates
   embedded select() statements against the table being updated or
   deleted.  this works the same as nested select() statement
   correlation, and can be disabled via the correlate=False flag on
   the embedded select().
- column labels are now generated in the compilation phase, which
   means their lengths are dialect-dependent.  So on oracle a label
   that gets truncated to 30 chars will go out to 63 characters
   on postgres.  Also, the true labelname is always attached as the
   accessor on the parent Selectable so theres no need to be aware
   of the "truncated" label names [ticket:512].
- column label and bind param "truncation" also generate
   deterministic names now, based on their ordering within the
   full statement being compiled.  this means the same statement
   will produce the same string across application restarts and
   allowing DB query plan caching to work better.
- the "mini" column labels generated when using subqueries, which
   are to work around glitchy SQLite behavior that doesnt understand
   "foo.id" as equivalent to "id", are now only generated in the case
   that those named columns are selected from (part of [ticket:513])
- the label() method on ColumnElement will properly propigate the
   TypeEngine of the base element out to the label, including a label()
   created from a scalar=True select() statement.
- MS-SQL better detects when a query is a subquery and knows not to
   generate ORDER BY phrases for those [ticket:513]
- fix for fetchmany() "size" argument being positional in most
   dbapis [ticket:505]
- sending None as an argument to func.<something> will produce
   an argument of NULL
- query strings in unicode URLs get keys encoded to ascii
   for **kwargs compat
- slight tweak to raw execute() change to also support tuples
   for positional parameters, not just lists [ticket:523]
- fix to case() construct to propigate the type of the first
   WHEN condition as the return type of the case statement

- orm:
- fixed critical issue when, after options(eagerload()) is used,
   the mapper would then always apply query "wrapping" behavior
   for all subsequent LIMIT/OFFSET/DISTINCT queries, even if no
   eager loading was applied on those subsequent queries.
- added query.with_parent(someinstance) method.  searches for
   target instance using lazy join criterion from parent instance.
   takes optional string "property" to isolate the desired relation.
   also adds static Query.query_from_parent(instance, property)
   version. [ticket:541]
- improved query.XXX_by(someprop=someinstance) querying to use
   similar methodology to with_parent, i.e. using the "lazy" clause
   which prevents adding the remote instance's table to the SQL,
   thereby making more complex conditions possible [ticket:554]
- added generative versions of aggregates, i.e. sum(), avg(), etc.
   to query. used via query.apply_max(), apply_sum(), etc.
   #552
- fix to using distinct() or distinct=True in combination with
   join() and similar
- corresponding to label/bindparam name generation, eager loaders
   generate deterministic names for the aliases they create using
   md5 hashes.
- improved/fixed custom collection classes when giving it "set"/
   "sets.Set" classes or subclasses (was still looking for append()
   methods on them during lazy loads)
- restored old "column_property()" ORM function (used to be called
   "column()") to force any column expression to be added as a property
   on a mapper, particularly those that aren't present in the mapped
   selectable.  this allows "scalar expressions" of any kind to be
   added as relations (though they have issues with eager loads).
- fix to many-to-many relationships targeting polymorphic mappers
   [ticket:533]
- making progress with session.merge() as well as combining its
   usage with entity_name [ticket:543]
- the usual adjustments to relationships between inheriting mappers,
   in this case establishing relation()s to subclass mappers where
   the join conditions come from the superclass' table

- informix:
- informix support added !  courtesy James Zhang, who put a ton
   of effort in.

- sqlite:
- removed silly behavior where sqlite would reflect UNIQUE indexes
   as part of the primary key (?!)

- oracle:
- small fix to allow successive compiles of the same SELECT object
   which features LIMIT/OFFSET.  oracle dialect needs to modify
   the object to have ROW_NUMBER OVER and wasn't performing
   the full series of steps on successive compiles.

- mysql
- support for SSL arguments given as inline within URL query string,
   prefixed with "ssl_", courtesy [EMAIL PROTECTED]
- mysql uses "DESCRIBE [<schemaname>].<tablename>", catching exceptions
   if table doesnt exist, in order to determine if a table exists.
   this supports unicode table names as well as schema names. tested
   with MySQL5 but should work with 4.1 series as well. (#557)

- extensions
- big fix to AssociationProxy so that multiple AssociationProxy
   objects can be associated with a single association collection.
- assign_mapper names methods according to their keys (i.e. __name__)
   #551

- mssql
- pyodbc is now the preferred DB-API for MSSQL, and if no module is
   specifically requested, will be loaded first on a module probe.

- The @@SCOPE_IDENTITY is now used instead of @@IDENTITY. This
   behavior may be overridden with the engine_connect
   "use_scope_identity" keyword parameter, which may also be specified
   in the dburi.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to