xref: /sqlalchemy/CHANGES (revision ba00071e)
14a6afd46SMike Bayer-*- coding: utf-8; fill-column: 68 -*-
24a6afd46SMike Bayer
3c86c9be7SJason Kirtland=======
4c86c9be7SJason KirtlandCHANGES
5c86c9be7SJason Kirtland=======
6f0b848c8SMike Bayer0.6.0b1
7f0b848c8SMike Bayer========
8f0b848c8SMike Bayer- Major Release
9f0b848c8SMike Bayer  - For the full set of feature descriptions, see
10f0b848c8SMike Bayer    http://www.sqlalchemy.org/trac/wiki/06Migration .
11f0b848c8SMike Bayer    This document is a work in progress.
12f0b848c8SMike Bayer
13f0b848c8SMike Bayer  - All bug fixes and feature enhancements from 0.5.6 and 
14f0b848c8SMike Bayer    below are also included within 0.6.
15f0b848c8SMike Bayer
16f0b848c8SMike Bayer  - Platforms targeted now include Python 2.4/2.5/2.6, Python
17f0b848c8SMike Bayer    3.1, Jython2.5.
18f0b848c8SMike Bayer    
19f0b848c8SMike Bayer- orm
204bd84510SMike Bayer  - Changes to query.update() and query.delete():
214bd84510SMike Bayer      - the 'expire' option on query.update() has been renamed to
224bd84510SMike Bayer        'fetch', thus matching that of query.delete()
23f0b848c8SMike Bayer
244bd84510SMike Bayer      - query.update() and query.delete() both default to
254bd84510SMike Bayer        'evaluate' for the synchronize strategy.
26114ad368SMike Bayer
274bd84510SMike Bayer      - the 'synchronize' strategy for update() and delete()
284bd84510SMike Bayer        raises an error on failure. There is no implicit fallback
294bd84510SMike Bayer        onto "fetch". Failure of evaluation is based on the
304bd84510SMike Bayer        structure of criteria, so success/failure is deterministic
314bd84510SMike Bayer        based on code structure.
32114ad368SMike Bayer
334bd84510SMike Bayer  - Enhancements on many-to-one relations:
344bd84510SMike Bayer      - many-to-one relations now fire off a lazyload in fewer
354bd84510SMike Bayer        cases, including in most cases will not fetch the "old"
364bd84510SMike Bayer        value when a new one is replaced.
374bd84510SMike Bayer
384bd84510SMike Bayer      - many-to-one relation to a joined-table subclass now uses
394bd84510SMike Bayer        get() for a simple load (known as the "use_get"
404bd84510SMike Bayer        condition), i.e. Related->Sub(Base), without the need to
414bd84510SMike Bayer        redefine the primaryjoin condition in terms of the base
424bd84510SMike Bayer        table. [ticket:1186]
434bd84510SMike Bayer
444bd84510SMike Bayer      - specifying a foreign key with a declarative column, i.e.
454bd84510SMike Bayer        ForeignKey(MyRelatedClass.id) doesn't break the "use_get"
464bd84510SMike Bayer        condition from taking place [ticket:1492]
474bd84510SMike Bayer
484bd84510SMike Bayer      - relation(), eagerload(), and eagerload_all() now feature
494bd84510SMike Bayer        an option called "innerjoin". Specify `True` or `False` to
504bd84510SMike Bayer        control whether an eager join is constructed as an INNER
514bd84510SMike Bayer        or OUTER join. Default is `False` as always. The mapper
524bd84510SMike Bayer        options will override whichever setting is specified on
534bd84510SMike Bayer        relation(). Should generally be set for many-to-one, not
544bd84510SMike Bayer        nullable foreign key relations to allow improved join
554bd84510SMike Bayer        performance. [ticket:1544]
564bd84510SMike Bayer
574bd84510SMike Bayer      - the behavior of eagerloading such that the main query is
584bd84510SMike Bayer        wrapped in a subquery when LIMIT/OFFSET are present now
594bd84510SMike Bayer        makes an exception for the case when all eager loads are
604bd84510SMike Bayer        many-to-one joins. In those cases, the eager joins are
614bd84510SMike Bayer        against the parent table directly along with the
624bd84510SMike Bayer        limit/offset without the extra overhead of a subquery,
634bd84510SMike Bayer        since a many-to-one join does not add rows to the result.
6485d49bdeSMike Bayer
6585d49bdeSMike Bayer  - Using a "dynamic" loader with a "secondary" table now produces
6685d49bdeSMike Bayer    a query where the "secondary" table is *not* aliased.  This
6785d49bdeSMike Bayer    allows the secondary Table object to be used in the "order_by"
6885d49bdeSMike Bayer    attribute of the relation(), and also allows it to be used
6985d49bdeSMike Bayer    in filter criterion against the dynamic relation.
7085d49bdeSMike Bayer    [ticket:1531]
7185d49bdeSMike Bayer
7285d49bdeSMike Bayer  - a "dynamic" loader sets up its query criterion at construction
7385d49bdeSMike Bayer    time so that the actual query is returned from non-cloning
7485d49bdeSMike Bayer    accessors like "statement".
7585d49bdeSMike Bayer    
76114ad368SMike Bayer  - the "named tuple" objects returned when iterating a
77114ad368SMike Bayer    Query() are now pickleable.
78cf6c66e7SMike Bayer
79cf6c66e7SMike Bayer  - mapping to a select() construct now requires that you 
80cf6c66e7SMike Bayer    make an alias() out of it distinctly.   This to eliminate
81cf6c66e7SMike Bayer    confusion over such issues as [ticket:1542]
822dfc500aSMike Bayer    
832dfc500aSMike Bayer  - query.join() has been reworked to provide more consistent 
842dfc500aSMike Bayer    behavior and more flexibility (includes [ticket:1537])
85f0b848c8SMike Bayer
862dfc500aSMike Bayer  - query.select_from() accepts multiple clauses to produce 
872dfc500aSMike Bayer    multiple comma separated entries within the FROM clause.
882dfc500aSMike Bayer    Useful when selecting from multiple-homed join() clauses.
892dfc500aSMike Bayer    
903984cad7SMike Bayer  - query.from_self(), query.union(), others which do a 
913984cad7SMike Bayer    "SELECT * from (SELECT...)" type of nesting will do
923984cad7SMike Bayer    a better job translating column expressions within the subquery
933984cad7SMike Bayer    to the columns clause of the outer query.  This is
943984cad7SMike Bayer    potentially backwards incompatible with 0.5, in that this 
953984cad7SMike Bayer    may break queries with literal expressions that do not have labels
963984cad7SMike Bayer    applied (i.e. literal('foo'), etc.)
973984cad7SMike Bayer    [ticket:1568]
983984cad7SMike Bayer    
99f0b848c8SMike Bayer  - the "dont_load=True" flag on Session.merge() is deprecated
100f0b848c8SMike Bayer    and is now "load=False".
101f0b848c8SMike Bayer
10287824331SMike Bayer  - `expression.null()` is fully understood the same way
10387824331SMike Bayer    None is when comparing an object/collection-referencing
10487824331SMike Bayer    attribute within query.filter(), filter_by(), etc.
10587824331SMike Bayer    [ticket:1415]
106f0b848c8SMike Bayer
107f0b848c8SMike Bayer  - added "make_transient()" helper function which transforms a
108f0b848c8SMike Bayer    persistent/ detached instance into a transient one (i.e.
109f0b848c8SMike Bayer    deletes the instance_key and removes from any session.)
110f0b848c8SMike Bayer    [ticket:1052]
111f0b848c8SMike Bayer
112c3b0df48SMike Bayer  - the allow_null_pks flag on mapper() is deprecated, and 
113c3b0df48SMike Bayer    the feature is turned "on" by default.  This means that 
114c3b0df48SMike Bayer    a row which has a non-null value for any of its primary key
115c3b0df48SMike Bayer    columns will be considered an identity.  The need for this
116c3b0df48SMike Bayer    scenario typically only occurs when mapping to an outer join.
117c3b0df48SMike Bayer    [ticket:1339]
118f0b848c8SMike Bayer
119bf207ae1SMike Bayer   - the mechanics of "backref" have been fully merged into the
120bf207ae1SMike Bayer     finer grained "back_populates" system, and take place entirely
121bf207ae1SMike Bayer     within the _generate_backref() method of RelationProperty.  This
122bf207ae1SMike Bayer     makes the initialization procedure of RelationProperty
123bf207ae1SMike Bayer     simpler and allows easier propagation of settings (such as from
124bf207ae1SMike Bayer     subclasses of RelationProperty) into the reverse reference. 
125bf207ae1SMike Bayer     The internal BackRef() is gone and backref() returns a plain 
126bf207ae1SMike Bayer     tuple that is understood by RelationProperty.
127bf207ae1SMike Bayer     
128eb6f1f87SMike Bayer   - Deprecated or removed:
129eb6f1f87SMike Bayer      * 'allow_null_pks' flag on mapper() is deprecated.  It does
130eb6f1f87SMike Bayer        nothing now and the setting is "on" in all cases.
131eb6f1f87SMike Bayer      * 'transactional' flag on sessionmaker() and others is
132eb6f1f87SMike Bayer        removed. Use 'autocommit=True' to indicate 'transactional=False'.
133eb6f1f87SMike Bayer      * 'polymorphic_fetch' argument on mapper() is removed.
134eb6f1f87SMike Bayer        Loading can be controlled using the 'with_polymorphic'
135eb6f1f87SMike Bayer        option.
136eb6f1f87SMike Bayer      * 'select_table' argument on mapper() is removed.  Use 
137eb6f1f87SMike Bayer        'with_polymorphic=("*", <some selectable>)' for this 
138eb6f1f87SMike Bayer        functionality.
139eb6f1f87SMike Bayer      * 'proxy' argument on synonym() is removed.  This flag
140eb6f1f87SMike Bayer        did nothing throughout 0.5, as the "proxy generation"
141eb6f1f87SMike Bayer        behavior is now automatic.
142eb6f1f87SMike Bayer      * Passing a single list of elements to eagerload(),
143eb6f1f87SMike Bayer        eagerload_all(), contains_eager(), lazyload(),
144eb6f1f87SMike Bayer        defer(), and undefer() instead of multiple positional 
145eb6f1f87SMike Bayer        *args is deprecated.
146eb6f1f87SMike Bayer      * Passing a single list of elements to query.order_by(),
147eb6f1f87SMike Bayer        query.group_by(), query.join(), or query.outerjoin()
148eb6f1f87SMike Bayer        instead of multiple positional *args is deprecated.
149eb6f1f87SMike Bayer      * query.iterate_instances() is removed.  Use query.instances().
150eb6f1f87SMike Bayer      * Query.query_from_parent() is removed.  Use the
151eb6f1f87SMike Bayer        sqlalchemy.orm.with_parent() function to produce a 
152eb6f1f87SMike Bayer        "parent" clause, or alternatively query.with_parent().
153eb6f1f87SMike Bayer      * query._from_self() is removed, use query.from_self()
154eb6f1f87SMike Bayer        instead.
155eb6f1f87SMike Bayer      * the "comparator" argument to composite() is removed.
156eb6f1f87SMike Bayer        Use "comparator_factory".
157eb6f1f87SMike Bayer      * RelationProperty._get_join() is removed.
158eb6f1f87SMike Bayer      * the 'echo_uow' flag on Session is removed.  Use
159eb6f1f87SMike Bayer        logging on the "sqlalchemy.orm.unitofwork" name.
160eb6f1f87SMike Bayer      * session.clear() is removed.  use session.expunge_all().
161eb6f1f87SMike Bayer      * session.save(), session.update(), session.save_or_update()
162eb6f1f87SMike Bayer        are removed.  Use session.add() and session.add_all().
163eb6f1f87SMike Bayer      * the "objects" flag on session.flush() remains deprecated.
164eb6f1f87SMike Bayer      * the "dont_load=True" flag on session.merge() is deprecated
165eb6f1f87SMike Bayer        in favor of "load=False".
166eb6f1f87SMike Bayer      * ScopedSession.mapper remains deprecated.  See the 
167eb6f1f87SMike Bayer        usage recipe at 
168eb6f1f87SMike Bayer        http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper
169eb6f1f87SMike Bayer      * passing an InstanceState (internal SQLAlchemy state object) to
170eb6f1f87SMike Bayer        attributes.init_collection() or attributes.get_history() is 
171eb6f1f87SMike Bayer        deprecated.  These functions are public API and normally
172eb6f1f87SMike Bayer        expect a regular mapped object instance.
173eb6f1f87SMike Bayer      * the 'engine' parameter to declarative_base() is removed.
174eb6f1f87SMike Bayer        Use the 'bind' keyword argument.
175eb6f1f87SMike Bayer        
176f0b848c8SMike Bayer- sql
177f0b848c8SMike Bayer    - the autoincrement flag on column now indicates the column
178f0b848c8SMike Bayer      which should be linked to cursor.lastrowid, if that method
179f0b848c8SMike Bayer      is used.  See the API docs for details.
180c5571ab1SMike Bayer    
181c5571ab1SMike Bayer    - an executemany() now requires that all bound parameter
182c5571ab1SMike Bayer      sets require that all keys are present which are 
183c5571ab1SMike Bayer      present in the first bound parameter set.  The structure
184c5571ab1SMike Bayer      and behavior of an insert/update statement is very much
185c5571ab1SMike Bayer      determined by the first parameter set, including which
186c5571ab1SMike Bayer      defaults are going to fire off, and a minimum of 
187c5571ab1SMike Bayer      guesswork is performed with all the rest so that performance
188c5571ab1SMike Bayer      is not impacted.  For this reason defaults would otherwise 
189c5571ab1SMike Bayer      silently "fail" for missing parameters, so this is now guarded 
190c5571ab1SMike Bayer      against. [ticket:1566]
191f0b848c8SMike Bayer      
192f0b848c8SMike Bayer    - returning() support is native to insert(), update(),
193f0b848c8SMike Bayer      delete(). Implementations of varying levels of
194f0b848c8SMike Bayer      functionality exist for Postgresql, Firebird, MSSQL and
195f0b848c8SMike Bayer      Oracle. returning() can be called explicitly with column
196f0b848c8SMike Bayer      expressions which are then returned in the resultset,
197f0b848c8SMike Bayer      usually via fetchone() or first().
198f0b848c8SMike Bayer
199f0b848c8SMike Bayer      insert() constructs will also use RETURNING implicitly to
200f0b848c8SMike Bayer      get newly generated primary key values, if the database
201f0b848c8SMike Bayer      version in use supports it (a version number check is
202f0b848c8SMike Bayer      performed). This occurs if no end-user returning() was
203f0b848c8SMike Bayer      specified.
204f0b848c8SMike Bayer
205a43a0e8bSMike Bayer    - insert() and update() constructs can now embed bindparam()
206a43a0e8bSMike Bayer      objects using names that match the keys of columns.  These
207a43a0e8bSMike Bayer      bind parameters will circumvent the usual route to those 
208a43a0e8bSMike Bayer      keys showing up in the VALUES or SET clause of the generated
209a43a0e8bSMike Bayer      SQL. [ticket:1579]
210a43a0e8bSMike Bayer      
211f0b848c8SMike Bayer    - Databases which rely upon postfetch of "last inserted id"
212f0b848c8SMike Bayer      to get at a generated sequence value (i.e. MySQL, MS-SQL)
213f0b848c8SMike Bayer      now work correctly when there is a composite primary key
214f0b848c8SMike Bayer      where the "autoincrement" column is not the first primary
215f0b848c8SMike Bayer      key column in the table.
216f0b848c8SMike Bayer
217f0b848c8SMike Bayer    - the last_inserted_ids() method has been renamed to the
218f0b848c8SMike Bayer      descriptor "inserted_primary_key".
219f0b848c8SMike Bayer
2200b292e88SMike Bayer    - the Binary type now returns data as a Python string
2210b292e88SMike Bayer      (or a "bytes" type in Python 3), instead of the built-
2220b292e88SMike Bayer      in "buffer" type.  This allows symmetric round trips
2230b292e88SMike Bayer      of binary data. [ticket:1524]
2240b292e88SMike Bayer      
225ebcdb289SMike Bayer    - User-defined "default" and "onupdate" callables which 
226ebcdb289SMike Bayer      accept a context should now call upon 
227ebcdb289SMike Bayer      "context.current_parameters" to get at the dictionary
228ebcdb289SMike Bayer      of bind parameters currently being processed.  This
229ebcdb289SMike Bayer      dict is available in the same way regardless of 
230ebcdb289SMike Bayer      single-execute or executemany-style statement execution.
231eb6f1f87SMike Bayer    
232eb6f1f87SMike Bayer    - Deprecated or removed:
233eb6f1f87SMike Bayer        * "scalar" flag on select() is removed, use 
234eb6f1f87SMike Bayer          select.as_scalar().
235eb6f1f87SMike Bayer        * "shortname" attribute on bindparam() is removed.
236eb6f1f87SMike Bayer        * postgres_returning, firebird_returning flags on 
237eb6f1f87SMike Bayer          insert(), update(), delete() are deprecated, use
238eb6f1f87SMike Bayer          the new returning() method.
239eb6f1f87SMike Bayer        * fold_equivalents flag on join is deprecated (will remain
240eb6f1f87SMike Bayer          until [ticket:1131] is implemented)
241eb6f1f87SMike Bayer    
242f0b848c8SMike Bayer- engines
243f0b848c8SMike Bayer  - transaction isolation level may be specified with
244f0b848c8SMike Bayer    create_engine(... isolation_level="..."); available on
245f0b848c8SMike Bayer    postgresql and sqlite. [ticket:443]
246f0b848c8SMike Bayer
247f0b848c8SMike Bayer  - added first() method to ResultProxy, returns first row and
248f0b848c8SMike Bayer    closes result set immediately.
249f0b848c8SMike Bayer
250114ad368SMike Bayer  - RowProxy objects are now pickleable, i.e. the object returned
251114ad368SMike Bayer    by result.fetchone(), result.fetchall() etc.
252114ad368SMike Bayer
25352b1ace6SMike Bayer  - ResultProxy internals have been overhauled to greatly reduce
25452b1ace6SMike Bayer    method call counts when fetching columns that have no 
25552b1ace6SMike Bayer    type-level processing applied.   Provides a 100% speed
25652b1ace6SMike Bayer    improvement when fetching large result sets with no unicode
25752b1ace6SMike Bayer    conversion.  Many thanks to Elixir's Gaëtan de Menten
25852b1ace6SMike Bayer    for this dramatic improvement !  [ticket:1586]
25952b1ace6SMike Bayer    
260066cdf13SMike Bayer  - setting echo=False on create_engine() now sets the loglevel
261066cdf13SMike Bayer    to WARN instead of NOTSET.  This so that logging can be
262066cdf13SMike Bayer    disabled for a particular engine even if logging
263066cdf13SMike Bayer    for "sqlalchemy.engine" is enabled overall.  Note that the
264066cdf13SMike Bayer    default setting of "echo" is `None`. [ticket:1554]
265eb6f1f87SMike Bayer  
26656f64addSMike Bayer  - Connection pool logging now uses both INFO and DEBUG
26756f64addSMike Bayer    log levels for logging.  INFO is for major events such
26856f64addSMike Bayer    as invalidated connections, DEBUG for all the acquire/return
26956f64addSMike Bayer    logging.  `echo_pool` can be False, None, True or "debug"
27056f64addSMike Bayer    the same way as `echo` works.
27156f64addSMike Bayer    
272eb6f1f87SMike Bayer  - deprecated or removed
273eb6f1f87SMike Bayer      * result.last_inserted_ids() is deprecated.  Use 
274eb6f1f87SMike Bayer        result.inserted_primary_key
2754b532e20SMike Bayer      * dialect.get_default_schema_name(connection) is now
2764b532e20SMike Bayer        public via dialect.default_schema_name.
277eb6f1f87SMike Bayer            
278f0b848c8SMike Bayer- schema
2790d2ae16aSMike Bayer    - the `__contains__()` method of `MetaData` now accepts
2800d2ae16aSMike Bayer      strings or `Table` objects as arguments.  If given
2810d2ae16aSMike Bayer      a `Table`, the argument is converted to `table.key` first,
2820d2ae16aSMike Bayer      i.e. "[schemaname.]<tablename>" [ticket:1541]
2830d2ae16aSMike Bayer      
284f0b848c8SMike Bayer    - deprecated MetaData.connect() and
285f0b848c8SMike Bayer      ThreadLocalMetaData.connect() have been removed - send
286f0b848c8SMike Bayer      the "bind" attribute to bind a metadata.
287f0b848c8SMike Bayer
288f0b848c8SMike Bayer    - deprecated metadata.table_iterator() method removed (use
289f0b848c8SMike Bayer      sorted_tables)
290eb6f1f87SMike Bayer    
291eb6f1f87SMike Bayer    - deprecated PassiveDefault - use DefaultClause.
292eb6f1f87SMike Bayer    
293f0b848c8SMike Bayer    - the "metadata" argument is removed from DefaultGenerator
294f0b848c8SMike Bayer      and subclasses, but remains locally present on Sequence,
295f0b848c8SMike Bayer      which is a standalone construct in DDL.
296f0b848c8SMike Bayer
297f0b848c8SMike Bayer    - Removed public mutability from Index and Constraint
298f0b848c8SMike Bayer      objects:
299f0b848c8SMike Bayer        - ForeignKeyConstraint.append_element()
300f0b848c8SMike Bayer        - Index.append_column()
301f0b848c8SMike Bayer        - UniqueConstraint.append_column()
302f0b848c8SMike Bayer        - PrimaryKeyConstraint.add()
303f0b848c8SMike Bayer        - PrimaryKeyConstraint.remove()
304f0b848c8SMike Bayer      These should be constructed declaratively (i.e. in one
305f0b848c8SMike Bayer      construction).
306e35dcee6SMike Bayer    
307e35dcee6SMike Bayer    - The "start" and "increment" attributes on Sequence now
308e35dcee6SMike Bayer      generate "START WITH" and "INCREMENT BY" by default,
309e35dcee6SMike Bayer      on Oracle and Postgresql.  Firebird doesn't support
310e35dcee6SMike Bayer      these keywords right now.  [ticket:1545]
311e35dcee6SMike Bayer      
312f0b848c8SMike Bayer    - UniqueConstraint, Index, PrimaryKeyConstraint all accept
313f0b848c8SMike Bayer      lists of column names or column objects as arguments.
314f0b848c8SMike Bayer
315f0b848c8SMike Bayer    - Other removed things:
316f0b848c8SMike Bayer        - Table.key (no idea what this was for)
317f0b848c8SMike Bayer        - Table.primary_key is not assignable - use
318f0b848c8SMike Bayer          table.append_constraint(PrimaryKeyConstraint(...))
319f0b848c8SMike Bayer        - Column.bind       (get via column.table.bind)
320f0b848c8SMike Bayer        - Column.metadata   (get via column.table.metadata)
3219bab004aSMike Bayer        - Column.sequence   (use column.default)
3229bab004aSMike Bayer        
323f0b848c8SMike Bayer    - The use_alter flag on ForeignKey is now a shortcut option
324f0b848c8SMike Bayer      for operations that can be hand-constructed using the
325f0b848c8SMike Bayer      DDL() event system. A side effect of this refactor is
326f0b848c8SMike Bayer      that ForeignKeyConstraint objects with use_alter=True
327f0b848c8SMike Bayer      will *not* be emitted on SQLite, which does not support
328f0b848c8SMike Bayer      ALTER for foreign keys. This has no effect on SQLite's
329f0b848c8SMike Bayer      behavior since SQLite does not actually honor FOREIGN KEY
330f0b848c8SMike Bayer      constraints.
331f0b848c8SMike Bayer
332f0b848c8SMike Bayer- Reflection/Inspection
333f0b848c8SMike Bayer    - Table reflection has been expanded and generalized into 
334f0b848c8SMike Bayer      a new API called "sqlalchemy.engine.reflection.Inspector".
335f0b848c8SMike Bayer      The Inspector object provides fine-grained information about
336f0b848c8SMike Bayer      a wide variety of schema information, with room for expansion,
337f0b848c8SMike Bayer      including table names, column names, view definitions, sequences,
338f0b848c8SMike Bayer      indexes, etc.  
339f0b848c8SMike Bayer      
340f0b848c8SMike Bayer    - The existing autoload=True system now uses Inspector underneath
341f0b848c8SMike Bayer      so that each dialect need only return "raw" data about tables
342f0b848c8SMike Bayer      and other objects - Inspector is the single place that information
343f0b848c8SMike Bayer      is compiled into Table objects so that consistency is at a maximum.
344f0b848c8SMike Bayer      
345f0b848c8SMike Bayer- DDL
346d6239f22SMike Bayer    - the DDL system has been greatly expanded.  the DDL() class
347d6239f22SMike Bayer      now extends the more generic DDLElement(), which forms the basis
348d6239f22SMike Bayer      of many new constructs:
349d6239f22SMike Bayer      
350f0b848c8SMike Bayer        - CreateTable()
351f0b848c8SMike Bayer        - DropTable()
352f0b848c8SMike Bayer        - AddConstraint()
353f0b848c8SMike Bayer        - DropConstraint()
354f0b848c8SMike Bayer        - CreateIndex()
355f0b848c8SMike Bayer        - DropIndex()
356f0b848c8SMike Bayer        - CreateSequence()
357f0b848c8SMike Bayer        - DropSequence()
358d6239f22SMike Bayer        
359d6239f22SMike Bayer       These support "on" and "execute-at()" just like plain DDL() 
360d6239f22SMike Bayer       does.  User-defined DDLElement subclasses can be created and 
361d6239f22SMike Bayer       linked to a compiler using the sqlalchemy.ext.compiler extension.
362d6239f22SMike Bayer
363d6239f22SMike Bayer    - The signature of the "on" callable passed to DDL() and
364d6239f22SMike Bayer      DDLElement() is revised as follows:
365d6239f22SMike Bayer      
366d6239f22SMike Bayer        "ddl" - the DDLElement object itself.
367d6239f22SMike Bayer        "event" - the string event name.
368d6239f22SMike Bayer        "target" - previously "schema_item", the Table or 
369d6239f22SMike Bayer        MetaData object triggering the event.
370d6239f22SMike Bayer        "connection" - the Connection object in use for the operation.
371d6239f22SMike Bayer        **kw - keyword arguments.  In the case of MetaData before/after
372d6239f22SMike Bayer          create/drop, the list of Table objects for which
373d6239f22SMike Bayer          CREATE/DROP DDL is to be issued is passed as the kw
374d6239f22SMike Bayer          argument "tables". This is necessary for metadata-level
375d6239f22SMike Bayer          DDL that is dependent on the presence of specific tables.
376d6239f22SMike Bayer
377d6239f22SMike Bayer      - the "schema_item" attribute of DDL has been renamed to 
378d6239f22SMike Bayer        "target".
379f0b848c8SMike Bayer
380f0b848c8SMike Bayer- dialect refactor
381f0b848c8SMike Bayer    - Dialect modules are now broken into database dialects
382f0b848c8SMike Bayer      plus DBAPI implementations. Connect URLs are now
383f0b848c8SMike Bayer      preferred to be specified using dialect+driver://...,
384f0b848c8SMike Bayer      i.e. "mysql+mysqldb://scott:tiger@localhost/test". See
385f0b848c8SMike Bayer      the 0.6 documentation for examples.
386f0b848c8SMike Bayer
3878495152bSMike Bayer    - the setuptools entrypoint for external dialects is now 
3888495152bSMike Bayer      called "sqlalchemy.dialects".
3898495152bSMike Bayer      
390f0b848c8SMike Bayer    - the "owner" keyword argument is removed from Table. Use
391f0b848c8SMike Bayer      "schema" to represent any namespaces to be prepended to
392f0b848c8SMike Bayer      the table name.
393f0b848c8SMike Bayer
394f0b848c8SMike Bayer    - server_version_info becomes a static attribute.
395f0b848c8SMike Bayer
396f0b848c8SMike Bayer    - dialects receive an initialize() event on initial
397f0b848c8SMike Bayer      connection to determine connection properties.
398f0b848c8SMike Bayer
399f0b848c8SMike Bayer    - dialects receive a visit_pool event have an opportunity
400f0b848c8SMike Bayer      to establish pool listeners.
401f0b848c8SMike Bayer
402f0b848c8SMike Bayer    - cached TypeEngine classes are cached per-dialect class 
403f0b848c8SMike Bayer      instead of per-dialect.
404f0b848c8SMike Bayer
405f0b848c8SMike Bayer    - Deprecated Dialect.get_params() removed.
406f0b848c8SMike Bayer
407f0b848c8SMike Bayer    - Dialect.get_rowcount() has been renamed to a descriptor
408f0b848c8SMike Bayer      "rowcount", and calls cursor.rowcount directly. Dialects
409f0b848c8SMike Bayer      which need to hardwire a rowcount in for certain calls
410f0b848c8SMike Bayer      should override the method to provide different behavior.
411f0b848c8SMike Bayer
412bc351a2dSMike Bayer    - DefaultRunner and subclasses have been removed.  The job
413bc351a2dSMike Bayer      of this object has been simplified and moved into 
414bc351a2dSMike Bayer      ExecutionContext.  Dialects which support sequences should
415bc351a2dSMike Bayer      add a `fire_sequence()` method to their execution context
416bc351a2dSMike Bayer      implementation.  [ticket:1566]
417bc351a2dSMike Bayer      
418f0b848c8SMike Bayer    - Functions and operators generated by the compiler now use
419f0b848c8SMike Bayer      (almost) regular dispatch functions of the form
420f0b848c8SMike Bayer      "visit_<opname>" and "visit_<funcname>_fn" to provide
421f0b848c8SMike Bayer      customed processing. This replaces the need to copy the
422f0b848c8SMike Bayer      "functions" and "operators" dictionaries in compiler
423f0b848c8SMike Bayer      subclasses with straightforward visitor methods, and also
424f0b848c8SMike Bayer      allows compiler subclasses complete control over
425f0b848c8SMike Bayer      rendering, as the full _Function or _BinaryExpression
426f0b848c8SMike Bayer      object is passed in.
427f0b848c8SMike Bayer
428f0b848c8SMike Bayer- postgresql
429f0b848c8SMike Bayer    - The "postgres" dialect is now named "postgresql" !
430f0b848c8SMike Bayer      Connection strings look like:
431f0b848c8SMike Bayer
432f0b848c8SMike Bayer           postgresql://scott:tiger@localhost/test
433f0b848c8SMike Bayer           postgresql+pg8000://scott:tiger@localhost/test
434f0b848c8SMike Bayer
435f0b848c8SMike Bayer       The "postgres" name remains for backwards compatiblity
436f0b848c8SMike Bayer       in the following ways:
437f0b848c8SMike Bayer
438f0b848c8SMike Bayer           - There is a "postgres.py" dummy dialect which
439f0b848c8SMike Bayer             allows old URLs to work, i.e.
440f0b848c8SMike Bayer             postgres://scott:tiger@localhost/test
441f0b848c8SMike Bayer
442f0b848c8SMike Bayer           - The "postgres" name can be imported from the old
443f0b848c8SMike Bayer             "databases" module, i.e. "from
444f0b848c8SMike Bayer             sqlalchemy.databases import postgres" as well as
445f0b848c8SMike Bayer             "dialects", "from sqlalchemy.dialects.postgres
446f0b848c8SMike Bayer             import base as pg", will send a deprecation
447f0b848c8SMike Bayer             warning.
448f0b848c8SMike Bayer
449f0b848c8SMike Bayer           - Special expression arguments are now named
450f0b848c8SMike Bayer             "postgresql_returning" and "postgresql_where", but
451f0b848c8SMike Bayer             the older "postgres_returning" and
452f0b848c8SMike Bayer             "postgres_where" names still work with a
453f0b848c8SMike Bayer             deprecation warning.
454aa557982SMike Bayer    
4555119ce78SMike Bayer    - The psycopg2 dialect now uses psycopg2's "unicode extension"
4565119ce78SMike Bayer      on all new connections, which allows all String/Text/etc.
4575119ce78SMike Bayer      types to skip the need to post-process bytestrings into
4585119ce78SMike Bayer      unicode (an expensive step due to its volume).  Other 
4595119ce78SMike Bayer      dialects which return unicode natively (pg8000, zxjdbc)
4605119ce78SMike Bayer      also skip unicode post-processing.
4615119ce78SMike Bayer      
462aa557982SMike Bayer    - Added new ENUM type, which exists as a schema-level
463aa557982SMike Bayer      construct and extends the generic Enum type.  Automatically
464aa557982SMike Bayer      associates itself with tables and their parent metadata
465aa557982SMike Bayer      to issue the appropriate CREATE TYPE/DROP TYPE 
466aa557982SMike Bayer      commands as needed, supports unicode labels, supports
467aa557982SMike Bayer      reflection.  [ticket:1511]
468e8854fe9SMike Bayer    
469e8854fe9SMike Bayer    - INTERVAL supports an optional "precision" argument 
470e8854fe9SMike Bayer      corresponding to the argument that PG accepts.
471e8854fe9SMike Bayer
472f0b848c8SMike Bayer    - using new dialect.initialize() feature to set up
473f0b848c8SMike Bayer      version-dependent behavior.
474f0b848c8SMike Bayer
475f0d2e599SMike Bayer    - somewhat better support for % signs in table/column names;
476f0d2e599SMike Bayer      psycopg2 can't handle a bind parameter name of 
477f0d2e599SMike Bayer      %(foobar)s however and SQLA doesn't want to add overhead
478f0d2e599SMike Bayer      just to treat that one non-existent use case.
479f0d2e599SMike Bayer      [ticket:1279]
480f0d2e599SMike Bayer    
4813d38969fSMike Bayer    - Inserting NULL into a primary key + foreign key column
4823d38969fSMike Bayer      will allow the "not null constraint" error to raise,
4833d38969fSMike Bayer      not an attempt to execute a nonexistent "col_id_seq" 
4843d38969fSMike Bayer      sequence.  [ticket:1516]
4853d38969fSMike Bayer    
4863d38969fSMike Bayer    - autoincrement SELECT statements, i.e. those which 
4873d38969fSMike Bayer      select from a procedure that modifies rows, now work 
4883d38969fSMike Bayer      with server-side cursor mode (the named cursor isn't 
4893d38969fSMike Bayer      used for such statements.)
4903d38969fSMike Bayer      
491f0b848c8SMike Bayer- mysql
492f0b848c8SMike Bayer    - all the _detect_XXX() functions now run once underneath
493f0b848c8SMike Bayer      dialect.initialize()
494f0b848c8SMike Bayer
495f0d2e599SMike Bayer    - somewhat better support for % signs in table/column names;
496f0d2e599SMike Bayer      MySQLdb can't handle % signs in SQL when executemany() is used,
497f0d2e599SMike Bayer      and SQLA doesn't want to add overhead just to treat that one 
498f0d2e599SMike Bayer      non-existent use case. [ticket:1279]
499eb6f1f87SMike Bayer    
500eb6f1f87SMike Bayer    - the BINARY and MSBinary types now generate "BINARY" in all
501eb6f1f87SMike Bayer      cases.  Omitting the "length" parameter will generate
502eb6f1f87SMike Bayer      "BINARY" with no length.  Use BLOB to generate an unlengthed
503eb6f1f87SMike Bayer      binary column.
504eb6f1f87SMike Bayer      
505eb6f1f87SMike Bayer    - the "quoting='quoted'" argument to MSEnum/ENUM is deprecated.
506eb6f1f87SMike Bayer      It's best to rely upon the automatic quoting.
507eb6f1f87SMike Bayer      
508aa557982SMike Bayer    - ENUM now subclasses the new generic Enum type, and also handles
509aa557982SMike Bayer      unicode values implicitly, if the given labelnames are unicode
510aa557982SMike Bayer      objects.
511aa557982SMike Bayer      
512f0b848c8SMike Bayer- oracle
513f0b848c8SMike Bayer    - unit tests pass 100% with cx_oracle !
514f0b848c8SMike Bayer
515f0b848c8SMike Bayer    - support for cx_Oracle's "native unicode" mode which does
516f0b848c8SMike Bayer      not require NLS_LANG to be set. Use the latest 5.0.2 or
517f0b848c8SMike Bayer      later of cx_oracle.
518f0b848c8SMike Bayer
519f0b848c8SMike Bayer    - an NCLOB type is added to the base types.
520680f87c9SMike Bayer    
521680f87c9SMike Bayer    - usage of the CHAR type results in cx_oracle's 
522680f87c9SMike Bayer      FIXED_CHAR dbapi type being bound to statements.
523680f87c9SMike Bayer      
524d564baf5SMike Bayer    - the Oracle dialect now features NUMBER which intends
525d564baf5SMike Bayer      to act justlike Oracle's NUMBER type.  It is the primary
526d564baf5SMike Bayer      numeric type returned by table reflection and attempts
527d564baf5SMike Bayer      to return Decimal()/float/int based on the precision/scale
528d564baf5SMike Bayer      parameters.  [ticket:885]
529d564baf5SMike Bayer      
530f0b848c8SMike Bayer    - func.char_length is a generic function for LENGTH
531f0b848c8SMike Bayer
532f0b848c8SMike Bayer    - ForeignKey() which includes onupdate=<value> will emit a
533f0b848c8SMike Bayer      warning, not emit ON UPDATE CASCADE which is unsupported
534f0b848c8SMike Bayer      by oracle
535f0b848c8SMike Bayer
536f0b848c8SMike Bayer    - the keys() method of RowProxy() now returns the result
537f0b848c8SMike Bayer      column names *normalized* to be SQLAlchemy case
538f0b848c8SMike Bayer      insensitive names. This means they will be lower case for
539f0b848c8SMike Bayer      case insensitive names, whereas the DBAPI would normally
540f0b848c8SMike Bayer      return them as UPPERCASE names. This allows row keys() to
541f0b848c8SMike Bayer      be compatible with further SQLAlchemy operations.
542f0b848c8SMike Bayer
543f0b848c8SMike Bayer    - using new dialect.initialize() feature to set up
544f0b848c8SMike Bayer      version-dependent behavior.
54553f1c775SMike Bayer    
54653f1c775SMike Bayer    - using types.BigInteger with Oracle will generate
54753f1c775SMike Bayer      NUMBER(19) [ticket:1125]
54853f1c775SMike Bayer      
549f0b848c8SMike Bayer- firebird
550f0b848c8SMike Bayer    - the keys() method of RowProxy() now returns the result
551f0b848c8SMike Bayer      column names *normalized* to be SQLAlchemy case
552f0b848c8SMike Bayer      insensitive names. This means they will be lower case for
553f0b848c8SMike Bayer      case insensitive names, whereas the DBAPI would normally
554f0b848c8SMike Bayer      return them as UPPERCASE names. This allows row keys() to
555f0b848c8SMike Bayer      be compatible with further SQLAlchemy operations.
556f0b848c8SMike Bayer
557f0b848c8SMike Bayer    - using new dialect.initialize() feature to set up
558f0b848c8SMike Bayer      version-dependent behavior.
559f0b848c8SMike Bayer
560f0b848c8SMike Bayer- new dialects
561f0b848c8SMike Bayer    - postgresql+pg8000
562f0b848c8SMike Bayer    - postgresql+pypostgresql (partial)
563f0b848c8SMike Bayer    - postgresql+zxjdbc
564f0b848c8SMike Bayer    - mysql+pyodbc
565f0b848c8SMike Bayer    - mysql+zxjdbc
566f0b848c8SMike Bayer
567f0b848c8SMike Bayer- mssql
568f0b848c8SMike Bayer    - MSSQL + Pyodbc + FreeTDS now works for the most part,
569f0b848c8SMike Bayer      with possible exceptions regarding binary data as well as
570f0b848c8SMike Bayer      unicode schema identifiers.
571f0b848c8SMike Bayer    - the "has_window_funcs" flag is removed. LIMIT/OFFSET
572f0b848c8SMike Bayer      usage will use ROW NUMBER as always, and if on an older
573f0b848c8SMike Bayer      version of SQL Server, the operation fails. The behavior
574f0b848c8SMike Bayer      is exactly the same except the error is raised by SQL
575f0b848c8SMike Bayer      server instead of the dialect, and no flag setting is
576f0b848c8SMike Bayer      required to enable it.
577f0b848c8SMike Bayer    - the "auto_identity_insert" flag is removed. This feature
578f0b848c8SMike Bayer      always takes effect when an INSERT statement overrides a
579f0b848c8SMike Bayer      column that is known to have a sequence on it. As with
580f0b848c8SMike Bayer      "has_window_funcs", if the underlying driver doesn't
581f0b848c8SMike Bayer      support this, then you can't do this operation in any
582f0b848c8SMike Bayer      case, so there's no point in having a flag.
583f0b848c8SMike Bayer    - using new dialect.initialize() feature to set up
584f0b848c8SMike Bayer      version-dependent behavior.
5859ae821eeSMichael Trier    - removed references to sequence which is no longer used.
5869ae821eeSMichael Trier      implicit identities in mssql work the same as implicit
5879ae821eeSMichael Trier      sequences on any other dialects. Explicit sequences are
5889ae821eeSMichael Trier      enabled through the use of "default=Sequence()". See
5899ae821eeSMichael Trier      the MSSQL dialect documentation for more information.
590f0b848c8SMike Bayer
591f0b848c8SMike Bayer- types
592f0b848c8SMike Bayer    - The construction of types within dialects has been totally
593f0b848c8SMike Bayer      overhauled.  Dialects now define publically available types
594f0b848c8SMike Bayer      as UPPERCASE names exclusively, and internal implementation
595f0b848c8SMike Bayer      types using underscore identifiers (i.e. are private).
596f0b848c8SMike Bayer      The system by which types are expressed in SQL and DDL
597f0b848c8SMike Bayer      has been moved to the compiler system.  This has the 
598f0b848c8SMike Bayer      effect that there are much fewer type objects within
599f0b848c8SMike Bayer      most dialects. A detailed document on this architecture
600f0b848c8SMike Bayer      for dialect authors is in 
601f0b848c8SMike Bayer      lib/sqlalchemy/dialects/type_migration_guidelines.txt .
602f0b848c8SMike Bayer
603f0b848c8SMike Bayer    - Types no longer make any guesses as to default
604f0b848c8SMike Bayer      parameters. In particular, Numeric, Float, NUMERIC,
605f0b848c8SMike Bayer      FLOAT, DECIMAL don't generate any length or scale unless
606f0b848c8SMike Bayer      specified.
6075119ce78SMike Bayer    
6085119ce78SMike Bayer    - String/Text/Unicode types now skip the unicode() check
6095119ce78SMike Bayer      on each result column value if the dialect has 
6105119ce78SMike Bayer      detected the DBAPI as returning Python unicode objects
6115119ce78SMike Bayer      natively.  This check is issued on first connect
6125119ce78SMike Bayer      using "SELECT CAST 'some text' AS VARCHAR(10)" or
6135119ce78SMike Bayer      equivalent, then checking if the returned object
6145119ce78SMike Bayer      is a Python unicode.   This allows vast performance
6155119ce78SMike Bayer      increases for native-unicode DBAPIs, including
6165119ce78SMike Bayer      pysqlite/sqlite3, psycopg2, and pg8000.
617f0b848c8SMike Bayer      
618f0b848c8SMike Bayer    - Reflection of types now returns the exact UPPERCASE
619f0b848c8SMike Bayer      type within types.py, or the UPPERCASE type within
620f0b848c8SMike Bayer      the dialect itself if the type is not a standard SQL 
621f0b848c8SMike Bayer      type.  This means reflection now returns more accurate
622f0b848c8SMike Bayer      information about reflected types.  
623aa557982SMike Bayer    
624eb9763feSMike Bayer    - Added a new Enum generic type. Enum is a schema-aware object
625eb9763feSMike Bayer      to support databases which require specific DDL in order to
626eb9763feSMike Bayer      use enum or equivalent; in the case of PG it handles the
627eb9763feSMike Bayer      details of `CREATE TYPE`, and on other databases without
628eb9763feSMike Bayer      native enum support will by generate VARCHAR + an inline CHECK
629eb9763feSMike Bayer      constraint to enforce the enum.
630aa557982SMike Bayer      [ticket:1109] [ticket:1511]
631f0b848c8SMike Bayer      
632f0b848c8SMike Bayer    - PickleType now uses == for comparison of values when
633f0b848c8SMike Bayer      mutable=True, unless the "comparator" argument with a
634f0b848c8SMike Bayer      comparsion function is specified to the type. Objects
635f0b848c8SMike Bayer      being pickled will be compared based on identity (which
636f0b848c8SMike Bayer      defeats the purpose of mutable=True) if __eq__() is not
637f0b848c8SMike Bayer      overridden or a comparison function is not provided.
638f0b848c8SMike Bayer      
639f0b848c8SMike Bayer    - The default "precision" and "scale" arguments of Numeric
640f0b848c8SMike Bayer      and Float have been removed and now default to None.
641f0b848c8SMike Bayer      NUMERIC and FLOAT will be rendered with no numeric
642f0b848c8SMike Bayer      arguments by default unless these values are provided.
643f0b848c8SMike Bayer
644f0b848c8SMike Bayer    - AbstractType.get_search_list() is removed - the games
645f0b848c8SMike Bayer      that was used for are no longer necessary.
64653f1c775SMike Bayer    
64753f1c775SMike Bayer    - Added a generic BigInteger type, compiles to 
64853f1c775SMike Bayer      BIGINT or NUMBER(19). [ticket:1125]
649ba00071eSMike Bayer
650ba00071eSMike Bayer-ext
651ba00071eSMike Bayer    - sqlsoup has been overhauled to explicitly support an 0.5 style
652ba00071eSMike Bayer      session, using autocommit=False, autoflush=True. Default
653ba00071eSMike Bayer      behavior of SQLSoup now requires the usual usage of commit()
654ba00071eSMike Bayer      and rollback(), which have been added to its interface. An
655ba00071eSMike Bayer      explcit Session or scoped_session can be passed to the
656ba00071eSMike Bayer      constructor, allowing these arguments to be overridden.
657ba00071eSMike Bayer
658ba00071eSMike Bayer    - sqlsoup db.<sometable>.update() and delete() now call
659ba00071eSMike Bayer      query(cls).update() and delete(), respectively.
660ba00071eSMike Bayer    
661ba00071eSMike Bayer    - sqlsoup now has execute() and connection(), which call upon
662ba00071eSMike Bayer      the Session methods of those names, ensuring that the bind is
663ba00071eSMike Bayer      in terms of the SqlSoup object's bind.
664ba00071eSMike Bayer    
665998183beSMike Bayer0.5.7
666998183beSMike Bayer=====
667998183beSMike Bayer- orm
668998183beSMike Bayer    - contains_eager() now works with the automatically 
669998183beSMike Bayer      generated subquery that results when you say 
670998183beSMike Bayer      "query(Parent).join(Parent.somejoinedsubclass)", i.e. 
671998183beSMike Bayer      when Parent joins to a joined-table-inheritance subclass.  
672998183beSMike Bayer      Previously contains_eager() would erroneously add the 
673998183beSMike Bayer      subclass table to the query separately producing a 
674998183beSMike Bayer      cartesian product.  An example is in the ticket
675998183beSMike Bayer      description.  [ticket:1543]
6766c12838fSMike Bayer    
6776c12838fSMike Bayer    - query.options() now only propagate to loaded objects
6786c12838fSMike Bayer      for potential further sub-loads only for options where
6796c12838fSMike Bayer      such behavior is relevant, keeping
6806c12838fSMike Bayer      various unserializable options like those generated
6816c12838fSMike Bayer      by contains_eager() out of individual instance states.
6826c12838fSMike Bayer      [ticket:1553]
6839f2e94fcSMike Bayer
68452fab3edSMike Bayer    - Mutable collection passed to the "extension" attribute
68552fab3edSMike Bayer      of relation(), column_property() etc. will not be mutated
68652fab3edSMike Bayer      or shared among multiple instrumentation calls, preventing
68752fab3edSMike Bayer      duplicate extensions, such as backref populators,
68852fab3edSMike Bayer      from being inserted into the list.
68952fab3edSMike Bayer      [ticket:1585]
690db352182SMike Bayer    
691db352182SMike Bayer    - Fixed the call to get_committed_value() on CompositeProperty.
692db352182SMike Bayer      [ticket:1504]
69343348d61SMike Bayer
69443348d61SMike Bayer    - Fixed bug where Query would crash if a join() with no clear
69543348d61SMike Bayer      "left" side were called when a non-mapped column entity
69643348d61SMike Bayer      appeared in the columns list. [ticket:1602]
69752fab3edSMike Bayer      
6987b457b97SMike Bayer- sql
699a69a094dSMike Bayer    - Fixed bug in two-phase transaction whereby commit() method
700a69a094dSMike Bayer      didn't set the full state which allows subsequent close()
701a69a094dSMike Bayer      call to succeed. [ticket:1603]
702a69a094dSMike Bayer      
7037b457b97SMike Bayer    - Fixed the "numeric" paramstyle, which apparently is the
7047b457b97SMike Bayer      default paramstyle used by Informixdb.
7057b457b97SMike Bayer      
706404f4389SMike Bayer    - Repeat expressions in the columns clause of a select
707404f4389SMike Bayer      are deduped based on the identity of each clause element,
708404f4389SMike Bayer      not the actual string.  This allows positional 
709404f4389SMike Bayer      elements to render correctly even if they all render
710404f4389SMike Bayer      identically, such as "qmark" style bind parameters.
711404f4389SMike Bayer      [ticket:1574]
712404f4389SMike Bayer      
7137b457b97SMike Bayer- postgresql
7147b457b97SMike Bayer    - Added support for reflecting the DOUBLE PRECISION type,
7157b457b97SMike Bayer      via a new postgres.PGDoublePrecision object.  
7167b457b97SMike Bayer      This is postgresql.DOUBLE_PRECISION in 0.6.
7177b457b97SMike Bayer      [ticket:1085]
7187b457b97SMike Bayer
719e8854fe9SMike Bayer    - Added support for reflecting the INTERVAL YEAR TO MONTH
720e8854fe9SMike Bayer      and INTERVAL DAY TO SECOND syntaxes of the INTERVAL 
721e8854fe9SMike Bayer      type.  [ticket:460]
722e8854fe9SMike Bayer
7235a140299SMike Bayer    - Corrected the "has_sequence" query to take current schema,
7245a140299SMike Bayer      or explicit sequence-stated schema, into account.
7255a140299SMike Bayer      [ticket:1576]
7265a140299SMike Bayer
7279f2e94fcSMike Bayer- mssql
7289f2e94fcSMike Bayer    - Changed the name of TrustedConnection to
7299f2e94fcSMike Bayer      Trusted_Connection when constructing pyodbc connect
7309f2e94fcSMike Bayer      arguments [ticket:1561]
7319f2e94fcSMike Bayer
7326535456eSMike Bayer- ext 
7336535456eSMike Bayer    - A column can be added to a joined-table declarative 
7346535456eSMike Bayer      superclass after the class has been constructed 
7356535456eSMike Bayer      (i.e. via class-level attribute assignment), and
7366535456eSMike Bayer      the column will be propagated down to 
7376535456eSMike Bayer      subclasses. [ticket:1570]  This is the reverse
7386535456eSMike Bayer      situation as that of [ticket:1523], fixed in 0.5.6.
739ed83a844SMike Bayer
740ed83a844SMike Bayer    - Fixed a slight inaccuracy in the sharding example.
741ed83a844SMike Bayer      Comparing equivalence of columns in the ORM is best 
742ed83a844SMike Bayer      accomplished using col1.shares_lineage(col2).
743ed83a844SMike Bayer      [ticket:1491]
744998183beSMike Bayer      
7458804e196SMike Bayer0.5.6
7468804e196SMike Bayer=====
747f300bb43SMike Bayer- orm
748f300bb43SMike Bayer    - Fixed bug whereby inheritance discriminator part of a
749f300bb43SMike Bayer      composite primary key would fail on updates.
750f300bb43SMike Bayer      Continuation of [ticket:1300].
75131f26e56SMike Bayer
75231f26e56SMike Bayer    - Fixed bug which disallowed one side of a many-to-many 
75331f26e56SMike Bayer      bidirectional reference to declare itself as "viewonly"
75431f26e56SMike Bayer      [ticket:1507]
755f83c9a39SMike Bayer    
756f83c9a39SMike Bayer    - Added an assertion that prevents a @validates function
757f83c9a39SMike Bayer      or other AttributeExtension from loading an unloaded
758f83c9a39SMike Bayer      collection such that internal state may be corrupted.
759f83c9a39SMike Bayer      [ticket:1526]
760f83c9a39SMike Bayer      
7610eab503aSMike Bayer    - Fixed bug which prevented two entities from mutually
7620eab503aSMike Bayer      replacing each other's primary key values within a single
7630eab503aSMike Bayer      flush() for some orderings of operations.  [ticket:1519]
7640eab503aSMike Bayer      
76572b9be71SMike Bayer    - Fixed an obscure issue whereby a joined-table subclass
76672b9be71SMike Bayer      with a self-referential eager load on the base class
76772b9be71SMike Bayer      would populate the related object's "subclass" table with
76872b9be71SMike Bayer      data from the "subclass" table of the parent.
76972b9be71SMike Bayer      [ticket:1485]
77072b9be71SMike Bayer      
771b9b62b23SMike Bayer    - relations() now have greater ability to be "overridden",
772b9b62b23SMike Bayer      meaning a subclass that explicitly specifies a relation()
773b9b62b23SMike Bayer      overriding that of the parent class will be honored
774b9b62b23SMike Bayer      during a flush.  This is currently to support 
775b9b62b23SMike Bayer      many-to-many relations from concrete inheritance setups.
776b9b62b23SMike Bayer      Outside of that use case, YMMV.  [ticket:1477]
777c1a36dfeSMike Bayer    
778306c9019SMike Bayer    - Squeezed a few more unnecessary "lazy loads" out of 
779306c9019SMike Bayer      relation().  When a collection is mutated, many-to-one
780306c9019SMike Bayer      backrefs on the other side will not fire off to load
781306c9019SMike Bayer      the "old" value, unless "single_parent=True" is set.  
782306c9019SMike Bayer      A direct assignment of a many-to-one still loads 
783306c9019SMike Bayer      the "old" value in order to update backref collections 
784306c9019SMike Bayer      on that value, which may be present in the session 
785306c9019SMike Bayer      already, thus maintaining the 0.5 behavioral contract.
786306c9019SMike Bayer      [ticket:1483]
787306c9019SMike Bayer      
788c1a36dfeSMike Bayer    - Fixed bug whereby a load/refresh of joined table
789c1a36dfeSMike Bayer      inheritance attributes which were based on 
790c1a36dfeSMike Bayer      column_property() or similar would fail to evaluate.
791c1a36dfeSMike Bayer      [ticket:1480]
79268c8b13eSMike Bayer    
79368c8b13eSMike Bayer    - Improved support for MapperProperty objects overriding
79468c8b13eSMike Bayer      that of an inherited mapper for non-concrete 
79568c8b13eSMike Bayer      inheritance setups - attribute extensions won't randomly
79668c8b13eSMike Bayer      collide with each other.  [ticket:1488]
79768c8b13eSMike Bayer    
7985cac19a9SMike Bayer    - UPDATE and DELETE do not support ORDER BY, LIMIT, OFFSET,
7995cac19a9SMike Bayer      etc. in standard SQL.  Query.update() and Query.delete()
8005cac19a9SMike Bayer      now raise an exception if any of limit(), offset(),
8015cac19a9SMike Bayer      order_by(), group_by(), or distinct() have been
8025cac19a9SMike Bayer      called. [ticket:1487]
8035cac19a9SMike Bayer      
80468c8b13eSMike Bayer    - Added AttributeExtension to sqlalchemy.orm.__all__
805c1a36dfeSMike Bayer      
8061e6df0eeSMike Bayer    - Improved error message when query() is called with
8071e6df0eeSMike Bayer      a non-SQL /entity expression. [ticket:1476]
808818c9a61SMike Bayer    
809818c9a61SMike Bayer    - Using False or 0 as a polymorphic discriminator now
810818c9a61SMike Bayer      works on the base class as well as a subclass.
811818c9a61SMike Bayer      [ticket:1440]
812c30cd4a6SMike Bayer
813c30cd4a6SMike Bayer    - Added enable_assertions(False) to Query which disables
814c30cd4a6SMike Bayer      the usual assertions for expected state - used
815c30cd4a6SMike Bayer      by Query subclasses to engineer custom state.
816c30cd4a6SMike Bayer      [ticket:1424].  See
817c30cd4a6SMike Bayer      http://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery
818c30cd4a6SMike Bayer      for an example.
819b303eb93SMike Bayer
820358ab55cSMike Bayer    - Fixed recursion issue which occured if a mapped object's
821358ab55cSMike Bayer      `__len__()` or `__nonzero__()` method resulted in state
822358ab55cSMike Bayer      changes.  [ticket:1501]
8232cb92cbbSMike Bayer
8242cb92cbbSMike Bayer    - Fixed incorrect exception raise in 
8252cb92cbbSMike Bayer      Weak/StrongIdentityMap.add() 
8262cb92cbbSMike Bayer      [ticket:1506]
827aa73243fSMike Bayer
828aa73243fSMike Bayer    - Fixed the error message for "could not find a FROM clause"
829aa73243fSMike Bayer      in query.join() which would fail to issue correctly
830aa73243fSMike Bayer      if the query was against a pure SQL construct.
831aa73243fSMike Bayer      [ticket:1522]
83231f26e56SMike Bayer    
833b303eb93SMike Bayer    - Fixed a somewhat hypothetical issue which would result
834b303eb93SMike Bayer      in the wrong primary key being calculated for a mapper
835b303eb93SMike Bayer      using the old polymorphic_union function - but this
836b303eb93SMike Bayer      is old stuff.  [ticket:1486]
837f300bb43SMike Bayer      
8388804e196SMike Bayer- sql
839f892d1a3SMike Bayer    - Fixed column.copy() to copy defaults and onupdates.
840f892d1a3SMike Bayer      [ticket:1373]
841f892d1a3SMike Bayer
8428804e196SMike Bayer    - Fixed a bug in extract() introduced in 0.5.4 whereby
8438804e196SMike Bayer      the string "field" argument was getting treated as a 
8448804e196SMike Bayer      ClauseElement, causing various errors within more 
8458804e196SMike Bayer      complex SQL transformations.
8464d036d6dSMike Bayer      
8474d036d6dSMike Bayer    - Unary expressions such as DISTINCT propagate their 
8484d036d6dSMike Bayer      type handling to result sets, allowing conversions like
8494d036d6dSMike Bayer      unicode and such to take place.  [ticket:1420]
85005a82671SMike Bayer    
85105a82671SMike Bayer    - Fixed bug in Table and Column whereby passing empty
85205a82671SMike Bayer      dict for "info" argument would raise an exception.
85305a82671SMike Bayer      [ticket:1482]
854e58b6683SMike Bayer
855e58b6683SMike Bayer- oracle
856e58b6683SMike Bayer    - Backported 0.6 fix for Oracle alias names not getting
857e58b6683SMike Bayer      truncated.  [ticket:1309]
8584d036d6dSMike Bayer      
859ed8742e6SMike Bayer- ext
860ed8742e6SMike Bayer   - The collection proxies produced by associationproxy are now
861ed8742e6SMike Bayer     pickleable.  A user-defined proxy_factory however
862ed8742e6SMike Bayer     is still not pickleable unless it defines __getstate__
863ed8742e6SMike Bayer     and __setstate__. [ticket:1446]
864a510e9f2SMike Bayer
865a510e9f2SMike Bayer   - Declarative will raise an informative exception if 
866a510e9f2SMike Bayer     __table_args__ is passed as a tuple with no dict argument.
867a510e9f2SMike Bayer     Improved documentation.  [ticket:1468]
86834aaabf7SMichael Trier
86975848ce2SMike Bayer   - Table objects declared in the MetaData can now be used
87075848ce2SMike Bayer     in string expressions sent to primaryjoin/secondaryjoin/
87175848ce2SMike Bayer     secondary - the name is pulled from the MetaData of the
87275848ce2SMike Bayer     declarative base.  [ticket:1527]
87375848ce2SMike Bayer     
8744888c89cSMike Bayer   - A column can be added to a joined-table subclass after
8754888c89cSMike Bayer     the class has been constructed (i.e. via class-level
8764888c89cSMike Bayer     attribute assignment).  The column is added to the underlying
8774888c89cSMike Bayer     Table as always, but now the mapper will rebuild its
8784888c89cSMike Bayer     "join" to include the new column, instead of raising
8794888c89cSMike Bayer     an error about "no such column, use column_property()
8804888c89cSMike Bayer     instead".  [ticket:1523]
8814888c89cSMike Bayer     
88234aaabf7SMichael Trier- test
88334aaabf7SMichael Trier   - Added examples into the test suite so they get exercised
88434aaabf7SMichael Trier     regularly and cleaned up a couple deprecation warnings.
88534aaabf7SMichael Trier
886a510e9f2SMike Bayer     
887e83a1a20SMike Bayer0.5.5
888fe390277SMike Bayer=======
88945cec095SMike Bayer- general
890c8fbedfcSJason Kirtland    - unit tests have been migrated from unittest to nose.  See
891c8fbedfcSJason Kirtland      README.unittests for information on how to run the tests.
892c8fbedfcSJason Kirtland      [ticket:970]
893c8fbedfcSJason Kirtland
894fe390277SMike Bayer- orm
895d99c0a9eSMike Bayer    - The "foreign_keys" argument of relation() will now propagate
896d99c0a9eSMike Bayer      automatically to the backref in the same way that primaryjoin
897d99c0a9eSMike Bayer      and secondaryjoin do.  For the extremely rare use case where
898d99c0a9eSMike Bayer      the backref of a relation() has intentionally different
899d99c0a9eSMike Bayer      "foreign_keys" configured, both sides now need to be
900d99c0a9eSMike Bayer      configured explicity (if they do in fact require this setting,
901d99c0a9eSMike Bayer      see the next note...).
902d99c0a9eSMike Bayer
903d99c0a9eSMike Bayer    - ...the only known (and really, really rare) use case where a
904d99c0a9eSMike Bayer      different foreign_keys setting was used on the
905d99c0a9eSMike Bayer      forwards/backwards side, a composite foreign key that
906d99c0a9eSMike Bayer      partially points to its own columns, has been enhanced such
907d99c0a9eSMike Bayer      that the fk->itself aspect of the relation won't be used to
908d99c0a9eSMike Bayer      determine relation direction.
909d99c0a9eSMike Bayer
910c8fbedfcSJason Kirtland    - Session.mapper is now *deprecated*.
911c8fbedfcSJason Kirtland
912c8fbedfcSJason Kirtland      Call session.add() if you'd like a free-standing object to be
913c2108dafSMike Bayer      part of your session.  Otherwise, a DIY version of
914c8fbedfcSJason Kirtland      Session.mapper is now documented at
915c2108dafSMike Bayer      http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper
916c2108dafSMike Bayer      The method will remain deprecated throughout 0.6.
917c8fbedfcSJason Kirtland
918d99c0a9eSMike Bayer    - Fixed Query being able to join() from individual columns of a
919d99c0a9eSMike Bayer      joined-table subclass entity, i.e.  query(SubClass.foo,
920d99c0a9eSMike Bayer      SubcClass.bar).join(<anything>).  In most cases, an error
921d99c0a9eSMike Bayer      "Could not find a FROM clause to join from" would be
922d99c0a9eSMike Bayer      raised. In a few others, the result would be returned in terms
923d99c0a9eSMike Bayer      of the base class rather than the subclass - so applications
924d99c0a9eSMike Bayer      which relied on this erroneous result need to be
925d99c0a9eSMike Bayer      adjusted. [ticket:1431]
926c8fbedfcSJason Kirtland
927c8fbedfcSJason Kirtland    - Fixed a bug involving contains_eager(), which would apply
928c8fbedfcSJason Kirtland      itself to a secondary (i.e. lazy) load in a particular rare
929c8fbedfcSJason Kirtland      case, producing cartesian products.  improved the targeting of
930c8fbedfcSJason Kirtland      query.options() on secondary loads overall [ticket:1461].
931c8fbedfcSJason Kirtland
932d99c0a9eSMike Bayer    - Fixed bug introduced in 0.5.4 whereby Composite types fail
933d99c0a9eSMike Bayer      when default-holding columns are flushed.
934d99c0a9eSMike Bayer
935c8fbedfcSJason Kirtland    - Fixed another 0.5.4 bug whereby mutable attributes
936c8fbedfcSJason Kirtland      (i.e. PickleType) wouldn't be deserialized correctly when the
937c8fbedfcSJason Kirtland      whole object was serialized.  [ticket:1426]
938c8fbedfcSJason Kirtland
939c8fbedfcSJason Kirtland    - Fixed bug whereby session.is_modified() would raise an
940c8fbedfcSJason Kirtland      exception if any synonyms were in use.
941c8fbedfcSJason Kirtland
942910961fcSMike Bayer    - Fixed potential memory leak whereby previously pickled objects
943910961fcSMike Bayer      placed back in a session would not be fully garbage collected
944910961fcSMike Bayer      unless the Session were explicitly closed out.
945c8fbedfcSJason Kirtland
946c8fbedfcSJason Kirtland    - Fixed bug whereby list-based attributes, like pickletype and
947c8fbedfcSJason Kirtland      PGArray, failed to be merged() properly.
948c8fbedfcSJason Kirtland
949c8fbedfcSJason Kirtland    - Repaired non-working attributes.set_committed_value function.
950c8fbedfcSJason Kirtland
951c8fbedfcSJason Kirtland    - Trimmed the pickle format for InstanceState which should
952c8fbedfcSJason Kirtland      further reduce the memory footprint of pickled instances.  The
953c8fbedfcSJason Kirtland      format should be backwards compatible with that of 0.5.4 and
954c8fbedfcSJason Kirtland      previous.
955c8fbedfcSJason Kirtland
956d99c0a9eSMike Bayer    - sqlalchemy.orm.join and sqlalchemy.orm.outerjoin are now
957d99c0a9eSMike Bayer      added to __all__ in sqlalchemy.orm.*. [ticket:1463]
958d99c0a9eSMike Bayer
959d99c0a9eSMike Bayer    - Fixed bug where Query exception raise would fail when
960d99c0a9eSMike Bayer      a too-short composite primary key value were passed to
961d99c0a9eSMike Bayer      get().  [ticket:1458]
962d99c0a9eSMike Bayer
9635ea1d673SMike Bayer- sql
9645ea1d673SMike Bayer    - Removed an obscure feature of execute() (including connection,
965c8fbedfcSJason Kirtland      engine, Session) whereby a bindparam() construct can be sent
966c8fbedfcSJason Kirtland      as a key to the params dictionary.  This usage is undocumented
9675ea1d673SMike Bayer      and is at the core of an issue whereby the bindparam() object
968c8fbedfcSJason Kirtland      created implicitly by a text() construct may have the same
969c8fbedfcSJason Kirtland      hash value as a string placed in the params dictionary and may
970c8fbedfcSJason Kirtland      result in an inappropriate match when computing the final bind
971c8fbedfcSJason Kirtland      parameters.  Internal checks for this condition would add
972c8fbedfcSJason Kirtland      significant latency to the critical task of parameter
9735ea1d673SMike Bayer      rendering, so the behavior is removed.  This is a backwards
9745ea1d673SMike Bayer      incompatible change for any application that may have been
9755ea1d673SMike Bayer      using this feature, however the feature has never been
9765ea1d673SMike Bayer      documented.
977ca4744c1SJason Kirtland
978ca4744c1SJason Kirtland- engine/pool
979c8fbedfcSJason Kirtland    - Implemented recreate() for StaticPool.
980ca4744c1SJason Kirtland
981ca4744c1SJason Kirtland
9823837a29bSMike Bayer0.5.4p2
9833837a29bSMike Bayer=======
9843837a29bSMike Bayer
9853837a29bSMike Bayer- sql
9863837a29bSMike Bayer    - Repaired the printing of SQL exceptions which are not 
98785399264SMike Bayer      based on parameters or are not executemany() style.
988d6b97577SMike Bayer      
9898fc5005dSMike Bayer- postgresql
990d6b97577SMike Bayer    - Deprecated the hardcoded TIMESTAMP function, which when
991d6b97577SMike Bayer      used as func.TIMESTAMP(value) would render "TIMESTAMP value".
9925503028dSMike Bayer      This breaks on some platforms as PostgreSQL doesn't allow
993d6b97577SMike Bayer      bind parameters to be used in this context.  The hard-coded
994d6b97577SMike Bayer      uppercase is also inappropriate and there's lots of other
995d6b97577SMike Bayer      PG casts that we'd need to support.  So instead, use
996d6b97577SMike Bayer      text constructs i.e. select(["timestamp '12/05/09'"]).
997d6b97577SMike Bayer      
998d6b97577SMike Bayer      
9997ff23a52SMike Bayer0.5.4p1
10007ff23a52SMike Bayer=======
10017ff23a52SMike Bayer
10027ff23a52SMike Bayer- orm
10037ff23a52SMike Bayer    - Fixed an attribute error introduced in 0.5.4 which would 
10047ff23a52SMike Bayer      occur when merge() was used with an incomplete object.
10057ff23a52SMike Bayer    
100618106b5eSMike Bayer0.5.4
100718106b5eSMike Bayer=====
1008aca84bebSJason Kirtland
100918106b5eSMike Bayer- orm
10102be867ffSMike Bayer    - Significant performance enhancements regarding Sessions/flush()
10112be867ffSMike Bayer      in conjunction with large mapper graphs, large numbers of 
10122be867ffSMike Bayer      objects:
10132be867ffSMike Bayer      
1014155466aaSMike Bayer      - Removed all* O(N) scanning behavior from the flush() process,
1015155466aaSMike Bayer        i.e. operations that were scanning the full session, 
1016155466aaSMike Bayer        including an extremely expensive one that was erroneously
1017155466aaSMike Bayer        assuming primary key values were changing when this 
1018155466aaSMike Bayer        was not the case.
1019155466aaSMike Bayer        
1020155466aaSMike Bayer        * one edge case remains which may invoke a full scan,
1021155466aaSMike Bayer          if an existing primary key attribute is modified
1022155466aaSMike Bayer          to a new value.
1023155466aaSMike Bayer      
10242be867ffSMike Bayer      - The Session's "weak referencing" behavior is now *full* -
10252be867ffSMike Bayer        no strong references whatsoever are made to a mapped object
10262be867ffSMike Bayer        or related items/collections in its __dict__.  Backrefs and 
10272be867ffSMike Bayer        other cycles in objects no longer affect the Session's ability 
10282be867ffSMike Bayer        to lose all references to unmodified objects.  Objects with 
10292be867ffSMike Bayer        pending changes still are maintained strongly until flush.  
10302be867ffSMike Bayer        [ticket:1398]
10312be867ffSMike Bayer        
10322be867ffSMike Bayer        The implementation also improves performance by moving
10332be867ffSMike Bayer        the "resurrection" process of garbage collected items
10342be867ffSMike Bayer        to only be relevant for mappings that map "mutable" 
10352be867ffSMike Bayer        attributes (i.e. PickleType, composite attrs).  This removes
10362be867ffSMike Bayer        overhead from the gc process and simplifies internal 
10372be867ffSMike Bayer        behavior.
10382be867ffSMike Bayer        
10392be867ffSMike Bayer        If a "mutable" attribute change is the sole change on an object 
10402be867ffSMike Bayer        which is then dereferenced, the mapper will not have access to 
10412be867ffSMike Bayer        other attribute state when the UPDATE is issued.  This may present 
10422be867ffSMike Bayer        itself differently to some MapperExtensions.
10432be867ffSMike Bayer        
10442be867ffSMike Bayer        The change also affects the internal attribute API, but not
10452be867ffSMike Bayer        the AttributeExtension interface nor any of the publically
10462be867ffSMike Bayer        documented attribute functions.
10472be867ffSMike Bayer        
10482be867ffSMike Bayer      - The unit of work no longer genererates a graph of "dependency"
10492be867ffSMike Bayer        processors for the full graph of mappers during flush(), instead
10502be867ffSMike Bayer        creating such processors only for those mappers which represent
10512be867ffSMike Bayer        objects with pending changes.  This saves a tremendous number
10522be867ffSMike Bayer        of method calls in the context of a large interconnected 
10532be867ffSMike Bayer        graph of mappers.
10542be867ffSMike Bayer        
10552be867ffSMike Bayer      - Cached a wasteful "table sort" operation that previously
10562be867ffSMike Bayer        occured multiple times per flush, also removing significant
10572be867ffSMike Bayer        method call count from flush().
10582be867ffSMike Bayer        
10592be867ffSMike Bayer      - Other redundant behaviors have been simplified in 
10602be867ffSMike Bayer        mapper._save_obj().
10612be867ffSMike Bayer      
10621ec5704dSMichael Trier    - Modified query_cls on DynamicAttributeImpl to accept a full
10631ec5704dSMichael Trier      mixin version of the AppenderQuery, which allows subclassing
10641ec5704dSMichael Trier      the AppenderMixin.
10651ec5704dSMichael Trier
1066eb30cb1fSMike Bayer    - The "polymorphic discriminator" column may be part of a 
1067eb30cb1fSMike Bayer      primary key, and it will be populated with the correct 
1068eb30cb1fSMike Bayer      discriminator value.  [ticket:1300]
1069eb30cb1fSMike Bayer      
10709ffd3ddbSAnts Aasma    - Fixed the evaluator not being able to evaluate IS NULL clauses.
10719ffd3ddbSAnts Aasma
1072aca84bebSJason Kirtland    - Fixed the "set collection" function on "dynamic" relations to
1073aca84bebSJason Kirtland      initiate events correctly.  Previously a collection could only
1074aca84bebSJason Kirtland      be assigned to a pending parent instance, otherwise modified
1075aca84bebSJason Kirtland      events would not be fired correctly.  Set collection is now
1076aca84bebSJason Kirtland      compatible with merge(), fixes [ticket:1352].
107785f75475SMike Bayer    
107885f75475SMike Bayer    - Allowed pickling of PropertyOption objects constructed with
107985f75475SMike Bayer      instrumented descriptors; previously, pickle errors would occur 
108085f75475SMike Bayer      when pickling an object which was loaded with a descriptor-based 
108185f75475SMike Bayer      option, such as query.options(eagerload(MyClass.foo)).
108285f75475SMike Bayer      
1083aca84bebSJason Kirtland    - Lazy loader will not use get() if the "lazy load" SQL clause
1084aca84bebSJason Kirtland      matches the clause used by get(), but contains some parameters
1085aca84bebSJason Kirtland      hardcoded.  Previously the lazy strategy would fail with the
1086aca84bebSJason Kirtland      get().  Ideally get() would be used with the hardcoded
1087aca84bebSJason Kirtland      parameters but this would require further development.
1088d0f67e2cSMike Bayer      [ticket:1357]
1089d0f67e2cSMike Bayer
1090f8daff6dSMike Bayer    - MapperOptions and other state associated with query.options()
1091f8daff6dSMike Bayer      is no longer bundled within callables associated with each 
1092f8daff6dSMike Bayer      lazy/deferred-loading attribute during a load.
1093f8daff6dSMike Bayer      The options are now associated with the instance's
1094f8daff6dSMike Bayer      state object just once when it's populated.  This removes
1095f8daff6dSMike Bayer      the need in most cases for per-instance/attribute loader 
1096f8daff6dSMike Bayer      objects, improving load speed and memory overhead for
1097f8daff6dSMike Bayer      individual instances. [ticket:1391]
1098f8daff6dSMike Bayer      
1099832ea82fSMike Bayer    - Fixed another location where autoflush was interfering
1100832ea82fSMike Bayer      with session.merge().  autoflush is disabled completely
1101832ea82fSMike Bayer      for the duration of merge() now. [ticket:1360]
1102d8c9dcc0SMike Bayer    
1103d8c9dcc0SMike Bayer    - Fixed bug which prevented "mutable primary key" dependency
1104d8c9dcc0SMike Bayer      logic from functioning properly on a one-to-one
1105d8c9dcc0SMike Bayer      relation().  [ticket:1406]
1106d8c9dcc0SMike Bayer      
110713cc1279SMike Bayer    - Fixed bug in relation(), introduced in 0.5.3, 
110813cc1279SMike Bayer      whereby a self referential relation
110913cc1279SMike Bayer      from a base class to a joined-table subclass would 
111013cc1279SMike Bayer      not configure correctly.
11110790f9c6SMike Bayer
11127af9d1c0SMike Bayer    - Fixed obscure mapper compilation issue when inheriting
11137af9d1c0SMike Bayer      mappers are used which would result in un-initialized
11147af9d1c0SMike Bayer      attributes.
11157af9d1c0SMike Bayer      
11160790f9c6SMike Bayer    - Fixed documentation for session weak_identity_map - 
11170790f9c6SMike Bayer      the default value is True, indicating a weak
11180790f9c6SMike Bayer      referencing map in use.
1119832ea82fSMike Bayer      
112099d3e251SMike Bayer    - Fixed a unit of work issue whereby the foreign
112199d3e251SMike Bayer      key attribute on an item contained within a collection 
112299d3e251SMike Bayer      owned by an object being deleted would not be set to
112399d3e251SMike Bayer      None if the relation() was self-referential. [ticket:1376]
11242a962802SMichael Trier
11257d0c5f72SAnts Aasma    - Fixed Query.update() and Query.delete() failures with eagerloaded
11267d0c5f72SAnts Aasma      relations. [ticket:1378]
11277d0c5f72SAnts Aasma
1128f19d4dc8SMike Bayer    - It is now an error to specify both columns of a binary primaryjoin
1129f19d4dc8SMike Bayer      condition in the foreign_keys or remote_side collection.  Whereas
1130f19d4dc8SMike Bayer      previously it was just nonsensical, but would succeed in a 
1131f19d4dc8SMike Bayer      non-deterministic way.
1132f19d4dc8SMike Bayer      
11332a962802SMichael Trier- schema
11342a962802SMichael Trier    - Added a quote_schema() method to the IdentifierPreparer class
11352a962802SMichael Trier      so that dialects can override how schemas get handled. This
11362a962802SMichael Trier      enables the MSSQL dialect to treat schemas as multipart
11372a962802SMichael Trier      identifiers, such as 'database.owner'. [ticket: 594, 1341]
11382a962802SMichael Trier
1139d65c25bcSMike Bayer- sql
1140d7e531ceSMike Bayer    - Back-ported the "compiler" extension from SQLA 0.6.  This
1141d7e531ceSMike Bayer      is a standardized interface which allows the creation of custom
1142d7e531ceSMike Bayer      ClauseElement subclasses and compilers.  In particular it's
1143d7e531ceSMike Bayer      handy as an alternative to text() when you'd like to 
1144d7e531ceSMike Bayer      build a construct that has database-specific compilations.
1145d7e531ceSMike Bayer      See the extension docs for details.
1146d7e531ceSMike Bayer      
11479cafc854SMike Bayer    - Exception messages are truncated when the list of bound 
11489cafc854SMike Bayer      parameters is larger than 10, preventing enormous
11499cafc854SMike Bayer      multi-page exceptions from filling up screens and logfiles
11509cafc854SMike Bayer      for large executemany() statements. [ticket:1413]
11519cafc854SMike Bayer      
1152aca84bebSJason Kirtland    - ``sqlalchemy.extract()`` is now dialect sensitive and can
1153aca84bebSJason Kirtland      extract components of timestamps idiomatically across the
1154aca84bebSJason Kirtland      supported databases, including SQLite.
1155aca84bebSJason Kirtland
1156aca84bebSJason Kirtland    - Fixed __repr__() and other _get_colspec() methods on
1157d65c25bcSMike Bayer      ForeignKey constructed from __clause_element__() style
1158d65c25bcSMike Bayer      construct (i.e. declarative columns).  [ticket:1353]
1159aca84bebSJason Kirtland
1160ab0434d6SMike Bayer- mysql
1161ab0434d6SMike Bayer    - Reflecting a FOREIGN KEY construct will take into account
1162ab0434d6SMike Bayer      a dotted schema.tablename combination, if the foreign key
1163ab0434d6SMike Bayer      references a table in a remote schema. [ticket:1405]
1164ab0434d6SMike Bayer      
1165e26b9e5fSMichael Trier- mssql
1166541a0c84SMichael Trier    - Modified how savepoint logic works to prevent it from
1167541a0c84SMichael Trier      stepping on non-savepoint oriented routines. Savepoint
1168541a0c84SMichael Trier      support is still very experimental.
1169541a0c84SMichael Trier
1170e14734c8SMichael Trier    - Added in reserved words for MSSQL that covers version 2008
1171e14734c8SMichael Trier      and all prior versions. [ticket:1310]
1172e14734c8SMichael Trier
1173e26b9e5fSMichael Trier    - Corrected problem with information schema not working with a
1174aca84bebSJason Kirtland      binary collation based database. Cleaned up information schema
1175aca84bebSJason Kirtland      since it is only used by mssql now. [ticket:1343]
1176e26b9e5fSMichael Trier
1177eba7328cSMichael Trier- sqlite
117801cdbd07SMichael Trier    - Corrected the SLBoolean type so that it properly treats only 1
117901cdbd07SMichael Trier      as True. [ticket:1402]
118001cdbd07SMichael Trier
1181eba7328cSMichael Trier    - Corrected the float type so that it correctly maps to a
1182eba7328cSMichael Trier      SLFloat type when being reflected. [ticket:1273]
1183eba7328cSMichael Trier
11847bb91d03SMichael Trier- extensions
11857bb91d03SMichael Trier
11867bb91d03SMichael Trier    - Fixed adding of deferred or other column properties to a
11877bb91d03SMichael Trier      declarative class. [ticket:1379]
11887bb91d03SMichael Trier
11897e7aa8f7SMike Bayer0.5.3
11907e7aa8f7SMike Bayer=====
11917e7aa8f7SMike Bayer- orm
1192b84c3b34SMike Bayer    - The "objects" argument to session.flush() is deprecated.
1193b84c3b34SMike Bayer      State which represents the linkage between a parent and
1194b84c3b34SMike Bayer      child object does not support "flushed" status on
1195b84c3b34SMike Bayer      one side of the link and not the other, so supporting
1196b84c3b34SMike Bayer      this operation leads to misleading results.
1197b84c3b34SMike Bayer      [ticket:1315]
1198b84c3b34SMike Bayer    
11997e7aa8f7SMike Bayer    - Query now implements __clause_element__() which produces
12007e7aa8f7SMike Bayer      its selectable, which means a Query instance can be accepted 
12017e7aa8f7SMike Bayer      in many SQL expressions, including col.in_(query), 
12027e7aa8f7SMike Bayer      union(query1, query2), select([foo]).select_from(query), 
12037e7aa8f7SMike Bayer      etc.
12047e7aa8f7SMike Bayer
120553deb989SMike Bayer    - Query.join() can now construct multiple FROM clauses, if 
120653deb989SMike Bayer      needed.  Such as, query(A, B).join(A.x).join(B.y)
120753deb989SMike Bayer      might say SELECT A.*, B.* FROM A JOIN X, B JOIN Y.  
120853deb989SMike Bayer      Eager loading can also tack its joins onto those 
120953deb989SMike Bayer      multiple FROM clauses.  [ticket:1337]
1210533a0ab9SMike Bayer
1211533a0ab9SMike Bayer    - Fixed bug in dynamic_loader() where append/remove events
1212533a0ab9SMike Bayer      after construction time were not being propagated to the 
1213533a0ab9SMike Bayer      UOW to pick up on flush(). [ticket:1347]
121453deb989SMike Bayer      
12153f0252abSMike Bayer    - Fixed bug where column_prefix wasn't being checked before
12163f0252abSMike Bayer      not mapping an attribute that already had class-level 
12173f0252abSMike Bayer      name present.
12183f0252abSMike Bayer
12191d318513SMike Bayer    - a session.expire() on a particular collection attribute
12201d318513SMike Bayer      will clear any pending backref additions as well, so that
12211d318513SMike Bayer      the next access correctly returns only what was present
12221d318513SMike Bayer      in the database.  Presents some degree of a workaround for 
12231d318513SMike Bayer      [ticket:1315], although we are considering removing the 
12241d318513SMike Bayer      flush([objects]) feature altogether.
1225911c7b9bSMike Bayer    
1226911c7b9bSMike Bayer    - Session.scalar() now converts raw SQL strings to text()
1227911c7b9bSMike Bayer      the same way Session.execute() does and accepts same 
1228911c7b9bSMike Bayer      alternative **kw args.
12291d318513SMike Bayer      
1230966119f4SMike Bayer    - improvements to the "determine direction" logic of 
1231966119f4SMike Bayer      relation() such that the direction of tricky situations 
1232966119f4SMike Bayer      like mapper(A.join(B)) -> relation-> mapper(B) can be
1233966119f4SMike Bayer      determined.
1234966119f4SMike Bayer      
12352dba55cbSMike Bayer    - When flushing partial sets of objects using session.flush([somelist]),
12362dba55cbSMike Bayer      pending objects which remain pending after the operation won't
12372dba55cbSMike Bayer      inadvertently be added as persistent. [ticket:1306]
123860dd7842SMike Bayer     
123960dd7842SMike Bayer    - Added "post_configure_attribute" method to InstrumentationManager,
124060dd7842SMike Bayer      so that the "listen_for_events.py" example works again.
124160dd7842SMike Bayer      [ticket:1314]
124268ee348dSMike Bayer    
124368ee348dSMike Bayer    - a forward and complementing backwards reference which are both
124468ee348dSMike Bayer      of the same direction, i.e. ONETOMANY or MANYTOONE, 
124568ee348dSMike Bayer      is now detected, and an error message is raised.   
124668ee348dSMike Bayer      Saves crazy CircularDependencyErrors later on.
124768ee348dSMike Bayer        
1248f180cc0cSMike Bayer    - Fixed bugs in Query regarding simultaneous selection of 
1249f180cc0cSMike Bayer      multiple joined-table inheritance entities with common base 
12501de90125SMike Bayer      classes:
12511de90125SMike Bayer      
12521de90125SMike Bayer      - previously the adaption applied to "B" on 
12531de90125SMike Bayer        "A JOIN B" would be erroneously partially applied 
12541de90125SMike Bayer        to "A".
12551de90125SMike Bayer      
12561de90125SMike Bayer      - comparisons on relations (i.e. A.related==someb)
12571de90125SMike Bayer        were not getting adapted when they should.
12581de90125SMike Bayer      
12591de90125SMike Bayer      - Other filterings, like 
12601de90125SMike Bayer        query(A).join(A.bs).filter(B.foo=='bar'), were erroneously
12611de90125SMike Bayer        adapting "B.foo" as though it were an "A".
12622cee9cb2SMike Bayer    
12638d295ec1SMike Bayer     - Fixed adaptation of EXISTS clauses via any(), has(), etc.
12648d295ec1SMike Bayer       in conjunction with an aliased object on the left and 
12658d295ec1SMike Bayer       of_type() on the right.  [ticket:1325]
12668d295ec1SMike Bayer       
12672cee9cb2SMike Bayer     - Added an attribute helper method ``set_committed_value`` in 
12682cee9cb2SMike Bayer       sqlalchemy.orm.attributes.  Given an object, attribute name,
12692cee9cb2SMike Bayer       and value, will set the value on the object as part of its
12702cee9cb2SMike Bayer       "committed" state, i.e. state that is understood to have 
12712cee9cb2SMike Bayer       been loaded from the database.   Helps with the creation of 
12722cee9cb2SMike Bayer       homegrown collection loaders and such.
1273e329fb31SMike Bayer
1274e8b57a47SMike Bayer     - Query won't fail with weakref error when a non-mapper/class
1275e8b57a47SMike Bayer       instrumented descriptor is passed, raises 
1276e8b57a47SMike Bayer       "Invalid column expession".
1277de06f512SMike Bayer    
1278de06f512SMike Bayer     - Query.group_by() properly takes into account aliasing applied
1279de06f512SMike Bayer       to the FROM clause, such as with select_from(), using
1280de06f512SMike Bayer       with_polymorphic(), or using from_self().
1281de06f512SMike Bayer        
12827e7aa8f7SMike Bayer- sql
12830983b610SMike Bayer    - An alias() of a select() will convert to a "scalar subquery"
12840983b610SMike Bayer      when used in an unambiguously scalar context, i.e. it's used 
12850983b610SMike Bayer      in a comparison operation.  This applies to
12860983b610SMike Bayer      the ORM when using query.subquery() as well.
12870983b610SMike Bayer      
1288e39b98caSMike Bayer    - Fixed missing _label attribute on Function object, others
1289e39b98caSMike Bayer      when used in a select() with use_labels (such as when used
1290e39b98caSMike Bayer      in an ORM column_property()).  [ticket:1302]
129103b5b341SMike Bayer
129203b5b341SMike Bayer    - anonymous alias names now truncate down to the max length
129303b5b341SMike Bayer      allowed by the dialect.  More significant on DBs like
129403b5b341SMike Bayer      Oracle with very small character limits. [ticket:1309]
1295e39b98caSMike Bayer      
12967e7aa8f7SMike Bayer    - the __selectable__() interface has been replaced entirely
12977e7aa8f7SMike Bayer      by __clause_element__().
129810dbde43SMike Bayer
129910dbde43SMike Bayer    - The per-dialect cache used by TypeEngine to cache
130010dbde43SMike Bayer      dialect-specific types is now a WeakKeyDictionary.
130110dbde43SMike Bayer      This to prevent dialect objects from 
130210dbde43SMike Bayer      being referenced forever for an application that 
130310dbde43SMike Bayer      creates an arbitrarily large number of engines
130410dbde43SMike Bayer      or dialects.   There is a small performance penalty
130510dbde43SMike Bayer      which will be resolved in 0.6.  [ticket:1299]
13061c751e3dSMike Bayer
13073ecf84f5SMike Bayer- sqlite
13083ecf84f5SMike Bayer    - Fixed SQLite reflection methods so that non-present
13093ecf84f5SMike Bayer      cursor.description, which triggers an auto-cursor
13103ecf84f5SMike Bayer      close, will be detected so that no results doesn't
13113ecf84f5SMike Bayer      fail on recent versions of pysqlite which raise 
13123ecf84f5SMike Bayer      an error when fetchone() called with no rows present.
13133ecf84f5SMike Bayer      
13148fc5005dSMike Bayer- postgresql
13151c751e3dSMike Bayer    - Index reflection won't fail when an index with 
13161c751e3dSMike Bayer      multiple expressions is encountered.
131777d6d315SMike Bayer      
131877d6d315SMike Bayer    - Added PGUuid and PGBit types to 
131977d6d315SMike Bayer      sqlalchemy.databases.postgres. [ticket:1327]
132077d6d315SMike Bayer    
132177d6d315SMike Bayer    - Refection of unknown PG types won't crash when those
132277d6d315SMike Bayer      types are specified within a domain.  [ticket:1327]
13237954673eSRick Morrison
13247954673eSRick Morrison- mssql
13257954673eSRick Morrison    - Preliminary support for pymssql 1.0.1
1326689a144aSMike Bayer
132707e28e74SMichael Trier    - Corrected issue on mssql where max_identifier_length was
132807e28e74SMichael Trier      not being respected.
132907e28e74SMichael Trier
1330689a144aSMike Bayer- extensions
1331689a144aSMike Bayer
1332689a144aSMike Bayer    - Fixed a recursive pickling issue in serializer, triggered
1333689a144aSMike Bayer      by an EXISTS or other embedded FROM construct.
1334689a144aSMike Bayer
1335734e02c4SMike Bayer    - Declarative locates the "inherits" class using a search
1336734e02c4SMike Bayer      through __bases__, to skip over mixins that are local
1337734e02c4SMike Bayer      to subclasses.   
1338734e02c4SMike Bayer      
1339689a144aSMike Bayer    - Declarative figures out joined-table inheritance primary join
1340689a144aSMike Bayer      condition even if "inherits" mapper argument is given 
1341734e02c4SMike Bayer      explicitly. 
1342689a144aSMike Bayer
134338c9a5beSMike Bayer    - Declarative will properly interpret the "foreign_keys" argument
134438c9a5beSMike Bayer      on a backref() if it's a string.
134538c9a5beSMike Bayer      
1346b60185a0SMike Bayer    - Declarative will accept a table-bound column as a property
1347b60185a0SMike Bayer      when used in conjunction with __table__, if the column is already
1348b60185a0SMike Bayer      present in __table__.  The column will be remapped to the given 
1349b60185a0SMike Bayer      key the same way as when added to the mapper() properties dict.
1350b60185a0SMike Bayer      
135107203994SMike Bayer0.5.2
135207203994SMike Bayer======
135398d7d706SJason Kirtland
13547c56371fSMike Bayer- orm
13557c56371fSMike Bayer    - Further refined 0.5.1's warning about delete-orphan cascade
13567c56371fSMike Bayer      placed on a many-to-many relation.   First, the bad news:
13577c56371fSMike Bayer      the warning will apply to both many-to-many as well as
13587c56371fSMike Bayer      many-to-one relations.  This is necessary since in both 
13597c56371fSMike Bayer      cases, SQLA does not scan the full set of potential parents
13607c56371fSMike Bayer      when determining "orphan" status - for a persistent object
13617c56371fSMike Bayer      it only detects an in-python de-association event to establish
13627c56371fSMike Bayer      the object as an "orphan".  Next, the good news: to support 
13637c56371fSMike Bayer      one-to-one via a foreign key or assocation table, or to 
13647c56371fSMike Bayer      support one-to-many via an association table, a new flag 
13657c56371fSMike Bayer      single_parent=True may be set which indicates objects 
13667c56371fSMike Bayer      linked to the relation are only meant to have a single parent.
13677c56371fSMike Bayer      The relation will raise an error if multiple parent-association
13687c56371fSMike Bayer      events occur within Python.
13697c56371fSMike Bayer
13703954df86SMike Bayer    - Adjusted the attribute instrumentation change from 0.5.1 to 
13713954df86SMike Bayer      fully establish instrumentation for subclasses where the mapper
13723954df86SMike Bayer      was created after the superclass had already been fully
13733954df86SMike Bayer      instrumented. [ticket:1292]
13743954df86SMike Bayer      
13757c56371fSMike Bayer    - Fixed bug in delete-orphan cascade whereby two one-to-one
13767c56371fSMike Bayer      relations from two different parent classes to the same target 
13777c56371fSMike Bayer      class would prematurely expunge the instance.
1378a7459fe1SMichael Trier
1379fc7de2aaSMike Bayer    - Fixed an eager loading bug whereby self-referential eager 
1380fc7de2aaSMike Bayer      loading would prevent other eager loads, self referential or not,
1381fc7de2aaSMike Bayer      from joining to the parent JOIN properly.  Thanks to Alex K
1382fc7de2aaSMike Bayer      for creating a great test case.
1383a03aed2dSMike Bayer    
1384a03aed2dSMike Bayer    - session.expire() and related methods will not expire() unloaded
1385a03aed2dSMike Bayer      deferred attributes.  This prevents them from being needlessly
1386a03aed2dSMike Bayer      loaded when the instance is refreshed.
1387c10104f0SMike Bayer
1388c10104f0SMike Bayer    - query.join()/outerjoin() will now properly join an aliased()
1389c10104f0SMike Bayer      construct to the existing left side, even if query.from_self()
1390c10104f0SMike Bayer      or query.select_from(someselectable) has been called.
1391c10104f0SMike Bayer      [ticket:1293]
1392fc7de2aaSMike Bayer      
139307203994SMike Bayer- sql
139407203994SMike Bayer    - Further fixes to the "percent signs and spaces in column/table
139507203994SMike Bayer       names" functionality. [ticket:1284]
139652e2c2d9SMichael Trier
139752e2c2d9SMichael Trier- mssql
139852e2c2d9SMichael Trier    - Restored convert_unicode handling. Results were being passed
139952e2c2d9SMichael Trier      on through without conversion. [ticket:1291]
140052e2c2d9SMichael Trier
1401a7459fe1SMichael Trier    - Really fixing the decimal handling this time. [ticket:1282].
1402a7459fe1SMichael Trier
14030caf9712SRick Morrison    - Modified table reflection code to use only kwargs when 
14040caf9712SRick Morrison      constructing tables. [Ticket:1289]
14050caf9712SRick Morrison
14067b3b9f55SMike Bayer0.5.1
14077b3b9f55SMike Bayer========
14087b3b9f55SMike Bayer
14097b3b9f55SMike Bayer- orm
1410345eaeedSMike Bayer    - Removed an internal join cache which could potentially leak 
1411345eaeedSMike Bayer      memory when issuing query.join() repeatedly to ad-hoc 
1412345eaeedSMike Bayer      selectables.
1413b996bcffSMike Bayer
1414b996bcffSMike Bayer    - The "clear()", "save()", "update()", "save_or_update()"
1415b996bcffSMike Bayer      Session methods have been deprecated, replaced by 
1416b996bcffSMike Bayer      "expunge_all()" and "add()".  "expunge_all()" has also
1417b996bcffSMike Bayer      been added to ScopedSession.
1418b996bcffSMike Bayer      
14197b3b9f55SMike Bayer    - Modernized the "no mapped table" exception and added a more
14207b3b9f55SMike Bayer      explicit __table__/__tablename__ exception to declarative.
1421209e888eSMike Bayer
1422209e888eSMike Bayer    - Concrete inheriting mappers now instrument attributes which
1423209e888eSMike Bayer      are inherited from the superclass, but are not defined for
1424209e888eSMike Bayer      the concrete mapper itself, with an InstrumentedAttribute that
1425209e888eSMike Bayer      issues a descriptive error when accessed. [ticket:1237]
1426209e888eSMike Bayer
1427209e888eSMike Bayer    - Added a new `relation()` keyword `back_populates`. This
1428209e888eSMike Bayer      allows configuation of backreferences using explicit
1429209e888eSMike Bayer      relations. [ticket:781] This is required when creating
1430209e888eSMike Bayer      bidirectional relations between a hierarchy of concrete
1431209e888eSMike Bayer      mappers and another class. [ticket:1237]
1432209e888eSMike Bayer
1433209e888eSMike Bayer    - Test coverage added for `relation()` objects specified on
1434209e888eSMike Bayer      concrete mappers. [ticket:1237]
1435454f1d7fSMike Bayer    
1436454f1d7fSMike Bayer    - Query.from_self() as well as query.subquery() both disable 
1437454f1d7fSMike Bayer      the rendering of eager joins inside the subquery produced.
1438454f1d7fSMike Bayer      The "disable all eager joins" feature is available publically
1439454f1d7fSMike Bayer      via a new query.enable_eagerloads() generative. [ticket:1276]
1440454f1d7fSMike Bayer      
1441454f1d7fSMike Bayer    - Added a rudimental series of set operations to Query that
1442454f1d7fSMike Bayer      receive Query objects as arguments, including union(),
1443454f1d7fSMike Bayer      union_all(), intersect(), except_(), insertsect_all(),
1444454f1d7fSMike Bayer      except_all().  See the API documentation for
1445454f1d7fSMike Bayer      Query.union() for examples. 
1446454f1d7fSMike Bayer
1447454f1d7fSMike Bayer    - Fixed bug that prevented Query.join() and eagerloads from 
1448454f1d7fSMike Bayer      attaching to a query that selected from a union or aliased union.
1449454f1d7fSMike Bayer      
1450209e888eSMike Bayer    - A short documentation example added for bidirectional
1451209e888eSMike Bayer      relations specified on concrete mappers. [ticket:1237]
1452209e888eSMike Bayer
1453209e888eSMike Bayer    - Mappers now instrument class attributes upon construction
1454209e888eSMike Bayer      with the final InstrumentedAttribute object which remains
1455209e888eSMike Bayer      persistent. The `_CompileOnAttr`/`__getattribute__()`
1456209e888eSMike Bayer      methodology has been removed. The net effect is that
1457209e888eSMike Bayer      Column-based mapped class attributes can now be used fully
1458209e888eSMike Bayer      at the class level without invoking a mapper compilation
1459209e888eSMike Bayer      operation, greatly simplifying typical usage patterns
1460209e888eSMike Bayer      within declarative. [ticket:1269]
1461209e888eSMike Bayer
1462313762e8SJason Kirtland    - ColumnProperty (and front-end helpers such as ``deferred``) no
1463313762e8SJason Kirtland      longer ignores unknown **keyword arguments.
1464313762e8SJason Kirtland
1465b23f8c0fSMike Bayer    - Fixed a bug with the unitofwork's "row switch" mechanism,
1466b23f8c0fSMike Bayer      i.e. the conversion of INSERT/DELETE into an UPDATE, when
1467b23f8c0fSMike Bayer      combined with joined-table inheritance and an object
1468b23f8c0fSMike Bayer      which contained no defined values for the child table where
1469b23f8c0fSMike Bayer      an UPDATE with no SET clause would be rendered.
147076a78180SMike Bayer
147179a7f172SMike Bayer    - Using delete-orphan on a many-to-many relation is deprecated.
147279a7f172SMike Bayer      This produces misleading or erroneous results since SQLA does 
147379a7f172SMike Bayer      not retrieve the full list of "parents" for m2m.  To get delete-orphan
147479a7f172SMike Bayer      behavior with an m2m table, use an explcit association class
147579a7f172SMike Bayer      so that the individual association row is treated as a parent.
147679a7f172SMike Bayer      [ticket:1281]
147779a7f172SMike Bayer    
147879a7f172SMike Bayer    - delete-orphan cascade always requires delete cascade.  Specifying
147979a7f172SMike Bayer      delete-orphan without delete now raises a deprecation warning.
148079a7f172SMike Bayer      [ticket:1281]
148179a7f172SMike Bayer      
148276a78180SMike Bayer- sql
148376a78180SMike Bayer    - Improved the methodology to handling percent signs in column
148476a78180SMike Bayer      names from [ticket:1256].  Added more tests.  MySQL and
14855503028dSMike Bayer      PostgreSQL dialects still do not issue correct CREATE TABLE
148676a78180SMike Bayer      statements for identifiers with percent signs in them.
1487b23f8c0fSMike Bayer      
1488209e888eSMike Bayer- schema
1489209e888eSMike Bayer    - Index now accepts column-oriented InstrumentedAttributes
1490209e888eSMike Bayer      (i.e. column-based mapped class attributes) as column
1491209e888eSMike Bayer      arguments. [ticket:1214]
149232add82dSMike Bayer
1493b99bdc7cSMike Bayer    - Column with no name (as in declarative) won't raise a 
1494b99bdc7cSMike Bayer      NoneType error when it's string output is requsted
1495b99bdc7cSMike Bayer      (such as in a stack trace).
1496b99bdc7cSMike Bayer      
149737b7e458SMike Bayer    - Fixed bug when overriding a Column with a ForeignKey
149837b7e458SMike Bayer      on a reflected table, where derived columns (i.e. the 
149937b7e458SMike Bayer      "virtual" columns of a select, etc.) would inadvertently
150037b7e458SMike Bayer      call upon schema-level cleanup logic intended only
150137b7e458SMike Bayer      for the original column. [ticket:1278]
150237b7e458SMike Bayer      
150332add82dSMike Bayer- declarative
150432add82dSMike Bayer    - Can now specify Column objects on subclasses which have no
150532add82dSMike Bayer      table of their own (i.e. use single table inheritance).  
150632add82dSMike Bayer      The columns will be appended to the base table, but only
150732add82dSMike Bayer      mapped by the subclass.
150832add82dSMike Bayer
150932add82dSMike Bayer    - For both joined and single inheriting subclasses, the subclass
151032add82dSMike Bayer      will only map those columns which are already mapped on the 
151132add82dSMike Bayer      superclass and those explicit on the subclass.  Other 
151232add82dSMike Bayer      columns that are present on the `Table` will be excluded
151332add82dSMike Bayer      from the mapping by default, which can be disabled
151432add82dSMike Bayer      by passing a blank `exclude_properties` collection to the
151532add82dSMike Bayer      `__mapper_args__`.  This is so that single-inheriting
151632add82dSMike Bayer      classes which define their own columns are the only classes
151732add82dSMike Bayer      to map those columns.   The effect is actually a more organized
151832add82dSMike Bayer      mapping than you'd normally get with explicit `mapper()`
151932add82dSMike Bayer      calls unless you set up the `exclude_properties` arguments
152032add82dSMike Bayer      explicitly.
15213e3f309cSMike Bayer
15223e3f309cSMike Bayer    - It's an error to add new Column objects to a declarative class
15233e3f309cSMike Bayer      that specified an existing table using __table__.
15247b3b9f55SMike Bayer      
1525c695c3e0SAnts Aasma- mysql
1526c695c3e0SAnts Aasma    - Added the missing keywords from MySQL 4.1 so they get escaped
1527c695c3e0SAnts Aasma      properly.
1528c695c3e0SAnts Aasma
15299a3b662eSMichael Trier- mssql
153027c4e7aaSMichael Trier    - Corrected handling of large decimal values with more robust
153127c4e7aaSMichael Trier      tests. Removed string manipulation on floats. [ticket:1280]
153227c4e7aaSMichael Trier
15339a3b662eSMichael Trier    - Modified the do_begin handling in mssql to use the Cursor not
15349a3b662eSMichael Trier      the Connection so it is DBAPI compatible.
15359a3b662eSMichael Trier
1536db33ad9dSMichael Trier    - Corrected SAVEPOINT support on adodbapi by changing the
1537db33ad9dSMichael Trier      handling of savepoint_release, which is unsupported on mssql.
1538db33ad9dSMichael Trier
1539786a96fdSMike Bayer0.5.0
15401ff2b782SMike Bayer========
154198d7d706SJason Kirtland
1542fff9409aSMike Bayer- new features
1543d9121952SMike Bayer- general
154498d7d706SJason Kirtland    - Documentation has been converted to Sphinx.  In particular,
154598d7d706SJason Kirtland      the generated API documentation has been constructed into a
154698d7d706SJason Kirtland      full blown "API Reference" section which organizes editorial
154798d7d706SJason Kirtland      documentation combined with generated docstrings.  Cross
154898d7d706SJason Kirtland      linking between sections and API docs are vastly improved, a
154998d7d706SJason Kirtland      javascript-powered search feature is provided, and a full
155098d7d706SJason Kirtland      index of all classes, functions and members is provided.
155198d7d706SJason Kirtland
155298d7d706SJason Kirtland    - setup.py now imports setuptools only optionally.  If not
155398d7d706SJason Kirtland      present, distutils is used.  The new "pip" installer is
155498d7d706SJason Kirtland      recommended over easy_install as it installs in a more
155598d7d706SJason Kirtland      simplified way.
1556d9121952SMike Bayer
15574220fc09SJason Kirtland    - added an extremely basic illustration of a PostGIS integration
15584220fc09SJason Kirtland      to the examples folder.
15594220fc09SJason Kirtland
1560d9121952SMike Bayer- orm
156198d7d706SJason Kirtland    - Query.with_polymorphic() now accepts a third argument
156298d7d706SJason Kirtland      "discriminator" which will replace the value of
156398d7d706SJason Kirtland      mapper.polymorphic_on for that query.  Mappers themselves no
156498d7d706SJason Kirtland      longer require polymorphic_on to be set, even if the mapper
156598d7d706SJason Kirtland      has a polymorphic_identity.  When not set, the mapper will
156698d7d706SJason Kirtland      load non-polymorphically by default. Together, these two
156798d7d706SJason Kirtland      features allow a non-polymorphic concrete inheritance setup to
156898d7d706SJason Kirtland      use polymorphic loading on a per-query basis, since concrete
156998d7d706SJason Kirtland      setups are prone to many issues when used polymorphically in
157098d7d706SJason Kirtland      all cases.
157198d7d706SJason Kirtland
157298d7d706SJason Kirtland    - dynamic_loader accepts a query_class= to customize the Query
157398d7d706SJason Kirtland      classes used for both the dynamic collection and the queries
157498d7d706SJason Kirtland      built from it.
15754220fc09SJason Kirtland
157688a79937SMike Bayer    - query.order_by() accepts None which will remove any pending
157788a79937SMike Bayer      order_by state from the query, as well as cancel out any
15784220fc09SJason Kirtland      mapper/relation configured ordering. This is primarily useful
157988a79937SMike Bayer      for overriding the ordering specified on a dynamic_loader().
158088a79937SMike Bayer      [ticket:1079]
15814220fc09SJason Kirtland
15827009653aSMike Bayer- sql
15834220fc09SJason Kirtland    - RowProxy objects can be used in place of dictionary arguments
15847009653aSMike Bayer      sent to connection.execute() and friends.  [ticket:935]
1585dfd80ba0SMichael Trier
1586dfd80ba0SMichael Trier- dialect
15874220fc09SJason Kirtland    - Added a new description_encoding attribute on the dialect that
15884220fc09SJason Kirtland      is used for encoding the column name when processing the
15894220fc09SJason Kirtland      metadata. This usually defaults to utf-8.
1590dfd80ba0SMichael Trier
15915b09d817SMichael Trier- mssql
15928669eda8SMichael Trier    - Added in a new MSGenericBinary type. This maps to the Binary
15938669eda8SMichael Trier      type so it can implement the specialized behavior of treating
15948669eda8SMichael Trier      length specified types as fixed-width Binary types and
15958669eda8SMichael Trier      non-length types as an unbound variable length Binary type.
15968669eda8SMichael Trier
1597defba2fcSMichael Trier    - Added in new types: MSVarBinary and MSImage. [ticket:1249]
15988669eda8SMichael Trier
1599bc2c1b2fSMichael Trier    - Added in the MSReal, MSNText, MSSmallDateTime, MSTime,
1600bc2c1b2fSMichael Trier      MSDateTimeOffset, and MSDateTime2 types
16015b09d817SMichael Trier
16026ea3521bSMichael Trier- sqlite
16034220fc09SJason Kirtland    - Table reflection now stores the actual DefaultClause value for
16044220fc09SJason Kirtland      the column. [ticket:1266]
16056ea3521bSMichael Trier
1606e1268d4fSMike Bayer- bugfixes, behavioral changes
16074e2d54fdSMike Bayer- general
1608e1268d4fSMike Bayer- orm
16094220fc09SJason Kirtland    - Exceptions raised during compile_mappers() are now preserved
16104220fc09SJason Kirtland      to provide "sticky behavior" - if a hasattr() call on a
16114220fc09SJason Kirtland      pre-compiled mapped attribute triggers a failing compile and
16124220fc09SJason Kirtland      suppresses the exception, subsequent compilation is blocked
16134220fc09SJason Kirtland      and the exception will be reiterated on the next compile()
16144220fc09SJason Kirtland      call.  This issue occurs frequently when using declarative.
1615f80471e6SMike Bayer
1616182badb2SMike Bayer    - property.of_type() is now recognized on a single-table
16174220fc09SJason Kirtland      inheriting target, when used in the context of
16184220fc09SJason Kirtland      prop.of_type(..).any()/has(), as well as
1619182badb2SMike Bayer      query.join(prop.of_type(...)).
16204220fc09SJason Kirtland
1621d14317fdSMike Bayer    - query.join() raises an error when the target of the join
16224220fc09SJason Kirtland      doesn't match the property-based attribute - while it's
1623d14317fdSMike Bayer      unlikely anyone is doing this, the SQLAlchemy author was
1624d14317fdSMike Bayer      guilty of this particular loosey-goosey behavior.
16254220fc09SJason Kirtland
1626ec344ebfSMike Bayer    - Fixed bug when using weak_instance_map=False where modified
1627ec344ebfSMike Bayer      events would not be intercepted for a flush(). [ticket:1272]
16284220fc09SJason Kirtland
16299fe69cb5SMike Bayer    - Fixed some deep "column correspondence" issues which could
16304220fc09SJason Kirtland      impact a Query made against a selectable containing multiple
16314220fc09SJason Kirtland      versions of the same table, as well as unions and similar
16324220fc09SJason Kirtland      which contained the same table columns in different column
16334220fc09SJason Kirtland      positions at different levels.  [ticket:1268]
16344220fc09SJason Kirtland
16354220fc09SJason Kirtland    - Custom comparator classes used in conjunction with
16364220fc09SJason Kirtland      column_property(), relation() etc. can define new comparison
16374220fc09SJason Kirtland      methods on the Comparator, which will become available via
16384220fc09SJason Kirtland      __getattr__() on the InstrumentedAttribute.  In the case of
16394220fc09SJason Kirtland      synonym() or comparable_property(), attributes are resolved
16404220fc09SJason Kirtland      first on the user-defined descriptor, then on the user-defined
164150dfbc7eSMike Bayer      comparator.
16424220fc09SJason Kirtland
1643f80471e6SMike Bayer    - Added ScopedSession.is_active accessor. [ticket:976]
16444220fc09SJason Kirtland
16454220fc09SJason Kirtland    - Can pass mapped attributes and column objects as keys to
16464220fc09SJason Kirtland      query.update({}).  [ticket:1262]
16474220fc09SJason Kirtland
16484220fc09SJason Kirtland    - Mapped attributes passed to the values() of an expression
16494220fc09SJason Kirtland      level insert() or update() will use the keys of the mapped
16504220fc09SJason Kirtland      columns, not that of the mapped attribute.
16514220fc09SJason Kirtland
16524220fc09SJason Kirtland    - Corrected problem with Query.delete() and Query.update() not
16534220fc09SJason Kirtland      working properly with bind parameters. [ticket:1242]
16544220fc09SJason Kirtland
16554220fc09SJason Kirtland    - Query.select_from(), from_statement() ensure that the given
16564220fc09SJason Kirtland      argument is a FromClause, or Text/Select/Union, respectively.
16574220fc09SJason Kirtland
16584220fc09SJason Kirtland    - Query() can be passed a "composite" attribute as a column
16594220fc09SJason Kirtland      expression and it will be expanded.  Somewhat related to
16604220fc09SJason Kirtland      [ticket:1253].
16614220fc09SJason Kirtland
16624220fc09SJason Kirtland    - Query() is a little more robust when passed various column
16634220fc09SJason Kirtland      expressions such as strings, clauselists, text() constructs
16644220fc09SJason Kirtland      (which may mean it just raises an error more nicely).
16654220fc09SJason Kirtland
16664d698a28SMike Bayer    - first() works as expected with Query.from_statement().
16674220fc09SJason Kirtland
16684220fc09SJason Kirtland    - Fixed bug introduced in 0.5rc4 involving eager loading not
16694220fc09SJason Kirtland      functioning for properties which were added to a mapper
16704220fc09SJason Kirtland      post-compile using add_property() or equivalent.
16714220fc09SJason Kirtland
16724220fc09SJason Kirtland    - Fixed bug where many-to-many relation() with viewonly=True
16734220fc09SJason Kirtland      would not correctly reference the link between
16744220fc09SJason Kirtland      secondary->remote.
16754220fc09SJason Kirtland
16764220fc09SJason Kirtland    - Duplicate items in a list-based collection will be maintained
16774220fc09SJason Kirtland      when issuing INSERTs to a "secondary" table in a many-to-many
16784220fc09SJason Kirtland      relation.  Assuming the m2m table has a unique or primary key
16794220fc09SJason Kirtland      constraint on it, this will raise the expected constraint
16804220fc09SJason Kirtland      violation instead of silently dropping the duplicate
16814220fc09SJason Kirtland      entries. Note that the old behavior remains for a one-to-many
16824220fc09SJason Kirtland      relation since collection entries in that case don't result in
16834220fc09SJason Kirtland      INSERT statements and SQLA doesn't manually police
16844220fc09SJason Kirtland      collections. [ticket:1232]
16854220fc09SJason Kirtland
16864220fc09SJason Kirtland    - Query.add_column() can accept FromClause objects in the same
16874220fc09SJason Kirtland      manner as session.query() can.
16884220fc09SJason Kirtland
16894220fc09SJason Kirtland    - Comparison of many-to-one relation to NULL is properly
16904220fc09SJason Kirtland      converted to IS NOT NULL based on not_().
16914220fc09SJason Kirtland
16924220fc09SJason Kirtland    - Extra checks added to ensure explicit
16934220fc09SJason Kirtland      primaryjoin/secondaryjoin are ClauseElement instances, to
16944220fc09SJason Kirtland      prevent more confusing errors later on. [ticket:1087]
16954220fc09SJason Kirtland
16964220fc09SJason Kirtland    - Improved mapper() check for non-class classes.  [ticket:1236]
16974220fc09SJason Kirtland
16984220fc09SJason Kirtland    - comparator_factory argument is now documented and supported by
16994220fc09SJason Kirtland      all MapperProperty types, including column_property(),
17004220fc09SJason Kirtland      relation(), backref(), and synonym() [ticket:5051].
17014220fc09SJason Kirtland
17024220fc09SJason Kirtland    - Changed the name of PropertyLoader to RelationProperty, to be
17034220fc09SJason Kirtland      consistent with all the other names.  PropertyLoader is still
17044220fc09SJason Kirtland      present as a synonym.
17054220fc09SJason Kirtland
17064220fc09SJason Kirtland    - fixed "double iter()" call causing bus errors in shard API,
17074220fc09SJason Kirtland      removed errant result.close() left over from the 0.4
17084220fc09SJason Kirtland      version. [ticket:1099] [ticket:1228]
17094220fc09SJason Kirtland
17104220fc09SJason Kirtland    - made Session.merge cascades not trigger autoflush.  Fixes
17114220fc09SJason Kirtland      merged instances getting prematurely inserted with missing
17124220fc09SJason Kirtland      values.
17134220fc09SJason Kirtland
17144220fc09SJason Kirtland    - Two fixes to help prevent out-of-band columns from being
17154220fc09SJason Kirtland      rendered in polymorphic_union inheritance scenarios (which
17164220fc09SJason Kirtland      then causes extra tables to be rendered in the FROM clause
17174220fc09SJason Kirtland      causing cartesian products):
17184220fc09SJason Kirtland
17194220fc09SJason Kirtland        - improvements to "column adaption" for a->b->c inheritance
17204220fc09SJason Kirtland          situations to better locate columns that are related to
17214220fc09SJason Kirtland          one another via multiple levels of indirection, rather
17224220fc09SJason Kirtland          than rendering the non-adapted column.
17234220fc09SJason Kirtland
17244220fc09SJason Kirtland        - the "polymorphic discriminator" column is only rendered
17254220fc09SJason Kirtland          for the actual mapper being queried against. The column
17264220fc09SJason Kirtland          won't be "pulled in" from a subclass or superclass mapper
17274220fc09SJason Kirtland          since it's not needed.
1728d245397bSMike Bayer
1729d245397bSMike Bayer    - Fixed shard_id argument on ShardedSession.execute().
1730d245397bSMike Bayer      [ticket:1072]
17314220fc09SJason Kirtland
17327c0ba802SMike Bayer- sql
17336cf4db7dSMike Bayer    - Columns can again contain percent signs within their
17346cf4db7dSMike Bayer      names. [ticket:1256]
17354220fc09SJason Kirtland
17364220fc09SJason Kirtland    - sqlalchemy.sql.expression.Function is now a public class.  It
17374220fc09SJason Kirtland      can be subclassed to provide user-defined SQL functions in an
17384220fc09SJason Kirtland      imperative style, including with pre-established behaviors.
17394220fc09SJason Kirtland      The postgis.py example illustrates one usage of this.
17404220fc09SJason Kirtland
17414220fc09SJason Kirtland    - PickleType now favors == comparison by default, if the
17424220fc09SJason Kirtland      incoming object (such as a dict) implements __eq__().  If the
17434220fc09SJason Kirtland      object does not implement __eq__() and mutable=True, a
17444220fc09SJason Kirtland      deprecation warning is raised.
17454220fc09SJason Kirtland
17464220fc09SJason Kirtland    - Fixed the import weirdness in sqlalchemy.sql to not export
17474220fc09SJason Kirtland      __names__ [ticket:1215].
17484220fc09SJason Kirtland
17494220fc09SJason Kirtland    - Using the same ForeignKey object repeatedly raises an error
17504220fc09SJason Kirtland      instead of silently failing later. [ticket:1238]
17514220fc09SJason Kirtland
17524220fc09SJason Kirtland    - Added NotImplementedError for params() method on
17534220fc09SJason Kirtland      Insert/Update/Delete constructs.  These items currently don't
17544220fc09SJason Kirtland      support this functionality, which also would be a little
17554220fc09SJason Kirtland      misleading compared to values().
17564220fc09SJason Kirtland
17574220fc09SJason Kirtland    - Reflected foreign keys will properly locate their referenced
17584220fc09SJason Kirtland      column, even if the column was given a "key" attribute
17594220fc09SJason Kirtland      different from the reflected name.  This is achieved via a new
17604220fc09SJason Kirtland      flag on ForeignKey/ForeignKeyConstraint called "link_to_name",
17614220fc09SJason Kirtland      if True means the given name is the referred-to column's name,
17624220fc09SJason Kirtland      not its assigned key.  [ticket:650]
17634220fc09SJason Kirtland
17644220fc09SJason Kirtland    - select() can accept a ClauseList as a column in the same way
17654220fc09SJason Kirtland      as a Table or other selectable and the interior expressions
17664220fc09SJason Kirtland      will be used as column elements. [ticket:1253]
17674220fc09SJason Kirtland
17684220fc09SJason Kirtland    - the "passive" flag on session.is_modified() is correctly
17694220fc09SJason Kirtland      propagated to the attribute manager.
17704220fc09SJason Kirtland
17714220fc09SJason Kirtland    - union() and union_all() will not whack any order_by() that has
17724220fc09SJason Kirtland      been applied to the select()s inside.  If you union() a
17734220fc09SJason Kirtland      select() with order_by() (presumably to support LIMIT/OFFSET),
17744220fc09SJason Kirtland      you should also call self_group() on it to apply parenthesis.
17754220fc09SJason Kirtland
17768220d9cdSMike Bayer- engine/pool
17774220fc09SJason Kirtland
17784220fc09SJason Kirtland    - Connection.invalidate() checks for closed status to avoid
17794220fc09SJason Kirtland      attribute errors. [ticket:1246]
17808220d9cdSMike Bayer
17818220d9cdSMike Bayer    - NullPool supports reconnect on failure behavior.
17828220d9cdSMike Bayer      [ticket:1094]
17838220d9cdSMike Bayer
17844220fc09SJason Kirtland    - Added a mutex for the initial pool creation when using
17854220fc09SJason Kirtland      pool.manage(dbapi).  This prevents a minor case of "dogpile"
17864220fc09SJason Kirtland      behavior which would otherwise occur upon a heavy load
17874220fc09SJason Kirtland      startup.  [ticket:799]
17884220fc09SJason Kirtland
17894220fc09SJason Kirtland    - _execute_clauseelement() goes back to being a private method.
17904220fc09SJason Kirtland      Subclassing Connection is not needed now that ConnectionProxy
17916a99f293SMike Bayer      is available.
17926a99f293SMike Bayer
17932c69cdb3SMike Bayer- documentation
179475e8350eSMike Bayer    - Tickets [ticket:1200] [ticket:1149].
17954220fc09SJason Kirtland
17962c69cdb3SMike Bayer    - Added note about create_session() defaults.
17974220fc09SJason Kirtland
17982c69cdb3SMike Bayer    - Added section about metadata.reflect().
17994220fc09SJason Kirtland
18002c69cdb3SMike Bayer    - Updated `TypeDecorator` section.
18014220fc09SJason Kirtland
18024220fc09SJason Kirtland    - Rewrote the "threadlocal" strategy section of the docs due to
18034220fc09SJason Kirtland      recent confusion over this feature.
18044220fc09SJason Kirtland
18054220fc09SJason Kirtland    - Removed badly out of date 'polymorphic_fetch' and
18064220fc09SJason Kirtland      'select_table' docs from inheritance, reworked the second half
18074220fc09SJason Kirtland      of "joined table inheritance".
18084220fc09SJason Kirtland
18094220fc09SJason Kirtland    - Documented `comparator_factory` kwarg, added new doc section
18104220fc09SJason Kirtland      "Custom Comparators".
18114220fc09SJason Kirtland
1812052d7f36SMichael Trier- mssql
18134220fc09SJason Kirtland    - Refactored the Date/Time types. The ``smalldatetime`` data
18144220fc09SJason Kirtland      type no longer truncates to a date only, and will now be
18154220fc09SJason Kirtland      mapped to the MSSmallDateTime type. [ticket:1254]
1816bc2c1b2fSMichael Trier
1817770f603aSMichael Trier    - Corrected an issue with Numerics to accept an int.
1818770f603aSMichael Trier
1819de97a18bSMichael Trier    - Mapped ``char_length`` to the ``LEN()`` function.
1820de97a18bSMichael Trier
1821f793a884SMichael Trier    - If an ``INSERT`` includes a subselect the ``INSERT`` is
1822f793a884SMichael Trier      converted from an ``INSERT INTO VALUES`` construct to a
1823f793a884SMichael Trier      ``INSERT INTO SELECT`` construct.
1824f793a884SMichael Trier
18254220fc09SJason Kirtland    - If the column is part of a ``primary_key`` it will be ``NOT
18264220fc09SJason Kirtland      NULL`` since MSSQL doesn't allow ``NULL`` in primary_key
1827cae83f6dSMichael Trier      columns.
1828cae83f6dSMichael Trier
1829defba2fcSMichael Trier    - ``MSBinary`` now returns a ``BINARY`` instead of an
1830defba2fcSMichael Trier      ``IMAGE``. This is a backwards incompatible change in that
18314220fc09SJason Kirtland      ``BINARY`` is a fixed length data type whereas ``IMAGE`` is a
18324220fc09SJason Kirtland      variable length data type. [ticket:1249]
1833defba2fcSMichael Trier
18344220fc09SJason Kirtland    - ``get_default_schema_name`` is now reflected from the database
18354220fc09SJason Kirtland      based on the user's default schema. This only works with MSSQL
18364220fc09SJason Kirtland      2005 and later. [ticket:1258]
183788aad2a3SMichael Trier
18385b09d817SMichael Trier    - Added collation support through the use of a new collation
18395b09d817SMichael Trier      argument. This is supported on the following types: char,
18405b09d817SMichael Trier      nchar, varchar, nvarchar, text, ntext. [ticket:1248]
18415b09d817SMichael Trier
1842886ddcd1SMichael Trier    - Changes to the connection string parameters favor DSN as the
1843886ddcd1SMichael Trier      default specification for pyodbc. See the mssql.py docstring
1844886ddcd1SMichael Trier      for detailed usage instructions.
1845886ddcd1SMichael Trier
18464220fc09SJason Kirtland    - Added experimental support of savepoints. It currently does
18474220fc09SJason Kirtland      not work fully with sessions.
1848052d7f36SMichael Trier
18494220fc09SJason Kirtland    - Support for three levels of column nullability: NULL, NOT
18504220fc09SJason Kirtland      NULL, and the database's configured default.  The default
18514220fc09SJason Kirtland      Column configuration (nullable=True) will now generate NULL in
18524220fc09SJason Kirtland      the DDL. Previously no specification was emitted and the
18535b09d817SMichael Trier      database default would take effect (usually NULL, but not
18545b09d817SMichael Trier      always).  To explicitly request the database default,
18554220fc09SJason Kirtland      configure columns with nullable=None and no specification will
18564220fc09SJason Kirtland      be emitted in DDL. This is backwards incompatible
18575b09d817SMichael Trier      behavior. [ticket:1243]
1858f9b86412SMichael Trier
18591ff2b782SMike Bayer- postgres
18604220fc09SJason Kirtland    - "%" signs in text() constructs are automatically escaped to
18614220fc09SJason Kirtland      "%%".  Because of the backwards incompatible nature of this
18624220fc09SJason Kirtland      change, a warning is emitted if '%%' is detected in the
18634220fc09SJason Kirtland      string.  [ticket:1267]
18645bc1f17cSMike Bayer
18651ff2b782SMike Bayer    - Calling alias.execute() in conjunction with
18661ff2b782SMike Bayer      server_side_cursors won't raise AttributeError.
1867ecc6c1daSMike Bayer
18685503028dSMike Bayer    - Added Index reflection support to PostgreSQL, using a great
18694220fc09SJason Kirtland      patch we long neglected, submitted by Ken
18704220fc09SJason Kirtland      Kuhlman. [ticket:714]
1871864644beSMike Bayer
1872ecc6c1daSMike Bayer- oracle
18734220fc09SJason Kirtland    - Adjusted the format of create_xid() to repair two-phase
18744220fc09SJason Kirtland      commit.  We now have field reports of Oracle two-phase commit
18754220fc09SJason Kirtland      working properly with this change.
18763c506294SJason Kirtland
18778598780eSMike Bayer    - Added OracleNVarchar type, produces NVARCHAR2, and also
18788598780eSMike Bayer      subclasses Unicode so that convert_unicode=True by default.
18794220fc09SJason Kirtland      NVARCHAR2 reflects into this type automatically so these
18804220fc09SJason Kirtland      columns pass unicode on a reflected table with no explicit
18818598780eSMike Bayer      convert_unicode=True flags.  [ticket:1233]
188267909d96SMike Bayer
18834220fc09SJason Kirtland    - Fixed bug which was preventing out params of certain types
18844220fc09SJason Kirtland      from being received; thanks a ton to huddlej at wwu.edu !
188567909d96SMike Bayer      [ticket:1265]
18864220fc09SJason Kirtland
18878dc7badaSMike Bayer- mysql
18884220fc09SJason Kirtland    - "%" signs in text() constructs are automatically escaped to
18894220fc09SJason Kirtland      "%%".  Because of the backwards incompatible nature of this
18904220fc09SJason Kirtland      change, a warning is emitted if '%%' is detected in the
18914220fc09SJason Kirtland      string.
18924220fc09SJason Kirtland
18938dc7badaSMike Bayer    - Fixed bug in exception raise when FK columns not present
18948dc7badaSMike Bayer      during reflection. [ticket:1241]
18954220fc09SJason Kirtland
18964220fc09SJason Kirtland    - Fixed bug involving reflection of a remote-schema table with a
18974220fc09SJason Kirtland      foreign key ref to another table in that schema.
18984220fc09SJason Kirtland
18993c506294SJason Kirtland- associationproxy
19003c506294SJason Kirtland    - The association proxy properties are make themselves available
19013c506294SJason Kirtland      at the class level, e.g. MyClass.aproxy.  Previously this
19023c506294SJason Kirtland      evaluated to None.
19033c506294SJason Kirtland
1904b563084dSMike Bayer- declarative
19054220fc09SJason Kirtland    - The full list of arguments accepted as string by backref()
19064220fc09SJason Kirtland      includes 'primaryjoin', 'secondaryjoin', 'secondary',
1907b563084dSMike Bayer      'foreign_keys', 'remote_side', 'order_by'.
19084220fc09SJason Kirtland
19098924a0e4SMichael Trier0.5.0rc4
19108924a0e4SMichael Trier========
1911043379efSMike Bayer- features
1912043379efSMike Bayer- orm
19134220fc09SJason Kirtland    - Query.count() has been enhanced to do the "right thing" in a
19144220fc09SJason Kirtland      wider variety of cases. It can now count multiple-entity
19154220fc09SJason Kirtland      queries, as well as column-based queries. Note that this means
19164220fc09SJason Kirtland      if you say query(A, B).count() without any joining criterion,
19174220fc09SJason Kirtland      it's going to count the cartesian product of A*B. Any query
19184220fc09SJason Kirtland      which is against column-based entities will automatically
19194220fc09SJason Kirtland      issue "SELECT count(1) FROM (SELECT...)" so that the real
19204220fc09SJason Kirtland      rowcount is returned, meaning a query such as
19214220fc09SJason Kirtland      query(func.count(A.name)).count() will return a value of one,
19224220fc09SJason Kirtland      since that query would return one row.
19234220fc09SJason Kirtland
19244220fc09SJason Kirtland    - Lots of performance tuning.  A rough guesstimate over various
19254220fc09SJason Kirtland      ORM operations places it 10% faster over 0.5.0rc3, 25-30% over
19264220fc09SJason Kirtland      0.4.8.
19274220fc09SJason Kirtland
1928e91bc867SMike Bayer- bugfixes and behavioral changes
19294cd99f55SMichael Trier- general:
19303f8914b4SMichael Trier    - global "propigate"->"propagate" change.
19314cd99f55SMichael Trier
1932e91bc867SMike Bayer- orm
19334220fc09SJason Kirtland    - Adjustments to the enhanced garbage collection on
19344220fc09SJason Kirtland      InstanceState to better guard against errors due to lost
19354220fc09SJason Kirtland      state.
19360148adecSMike Bayer
19374220fc09SJason Kirtland    - Query.get() returns a more informative error message when
19384220fc09SJason Kirtland      executed against multiple entities.  [ticket:1220]
19390cff2272SMike Bayer
19402c5f3e83SMike Bayer    - Restored NotImplementedError on Cls.relation.in_()
19412c5f3e83SMike Bayer      [ticket:1140] [ticket:1221]
19424220fc09SJason Kirtland
19434220fc09SJason Kirtland    - Fixed PendingDeprecationWarning involving order_by parameter
19444220fc09SJason Kirtland      on relation(). [ticket:1226]
19454220fc09SJason Kirtland
19460cff2272SMike Bayer- sql
19474220fc09SJason Kirtland    - Removed the 'properties' attribute of the Connection object,
19484220fc09SJason Kirtland      Connection.info should be used.
19494220fc09SJason Kirtland
19504220fc09SJason Kirtland    - Restored "active rowcount" fetch before ResultProxy autocloses
19514220fc09SJason Kirtland      the cursor.  This was removed in 0.5rc3.
19524220fc09SJason Kirtland
19534220fc09SJason Kirtland    - Rearranged the `load_dialect_impl()` method in `TypeDecorator`
19544220fc09SJason Kirtland      such that it will take effect even if the user-defined
19554220fc09SJason Kirtland      `TypeDecorator` uses another `TypeDecorator` as its impl.
19564220fc09SJason Kirtland
19573f8914b4SMichael Trier- access
19583f8914b4SMichael Trier    - Added support for Currency type.
19593f8914b4SMichael Trier
19603f8914b4SMichael Trier    - Functions were not return their result. [ticket:1017]
19613f8914b4SMichael Trier
19624220fc09SJason Kirtland    - Corrected problem with joins. Access only support LEFT OUTER
19634220fc09SJason Kirtland      or INNER not just JOIN by itself.  [ticket:1017]
19643f8914b4SMichael Trier
19658924a0e4SMichael Trier- mssql
19664220fc09SJason Kirtland    - Lots of cleanup and fixes to correct problems with limit and
19674220fc09SJason Kirtland      offset.
19688924a0e4SMichael Trier
19694220fc09SJason Kirtland    - Correct situation where subqueries as part of a binary
19704220fc09SJason Kirtland      expression need to be translated to use the IN and NOT IN
19714220fc09SJason Kirtland      syntax.
19728924a0e4SMichael Trier
19734220fc09SJason Kirtland    - Fixed E Notation issue that prevented the ability to insert
19744220fc09SJason Kirtland      decimal values less than 1E-6. [ticket:1216]
197517980ba8SMichael Trier
19764220fc09SJason Kirtland    - Corrected problems with reflection when dealing with schemas,
19774220fc09SJason Kirtland      particularly when those schemas are the default
19784220fc09SJason Kirtland      schema. [ticket:1217]
1979a8c308f3SMichael Trier
19804220fc09SJason Kirtland    - Corrected problem with casting a zero length item to a
19814220fc09SJason Kirtland      varchar. It now correctly adjusts the CAST.
198261178c5dSMichael Trier
19830148adecSMike Bayer- ext
19844220fc09SJason Kirtland    - Can now use a custom "inherit_condition" in __mapper_args__
19854220fc09SJason Kirtland      when using declarative.
19864220fc09SJason Kirtland
19874220fc09SJason Kirtland    - fixed string-based "remote_side", "order_by" and others not
19884220fc09SJason Kirtland      propagating correctly when used in backref().
19894220fc09SJason Kirtland
1990a20222fcSMike Bayer0.5.0rc3
1991a20222fcSMike Bayer========
1992da59591aSMike Bayer- features
1993e6141ef8SMike Bayer- orm
19944220fc09SJason Kirtland    - Added two new hooks to SessionExtension: after_bulk_delete()
19954220fc09SJason Kirtland      and after_bulk_update().  after_bulk_delete() is called after
19964220fc09SJason Kirtland      a bulk delete() operation on a query. after_bulk_update() is
19974220fc09SJason Kirtland      called after a bulk update() operation on a query.
199884003a8dSMartijn Faassen
1999e6141ef8SMike Bayer- sql
20004220fc09SJason Kirtland    - SQL compiler optimizations and complexity reduction. The call
20014220fc09SJason Kirtland      count for compiling a typical select() construct is 20% less
20024220fc09SJason Kirtland      versus 0.5.0rc2.
20030a480751SMike Bayer
20040a480751SMike Bayer    - Dialects can now generate label names of adjustable
20050a480751SMike Bayer      length. Pass in the argument "label_length=<value>" to
20064220fc09SJason Kirtland      create_engine() to adjust how many characters max will be
20074220fc09SJason Kirtland      present in dynamically generated column labels, i.e.
20084220fc09SJason Kirtland      "somecolumn AS somelabel". Any value less than 6 will result
20094220fc09SJason Kirtland      in a label of minimal size, consisting of an underscore and a
20104220fc09SJason Kirtland      numeric counter. The compiler uses the value of
20114220fc09SJason Kirtland      dialect.max_identifier_length as a default.  [ticket:1211]
2012da59591aSMike Bayer
2013e6141ef8SMike Bayer- ext
20144220fc09SJason Kirtland    - Added a new extension sqlalchemy.ext.serializer.  Provides
20154220fc09SJason Kirtland      Serializer/Deserializer "classes" which mirror
20160a480751SMike Bayer      Pickle/Unpickle, as well as dumps() and loads(). This
20174220fc09SJason Kirtland      serializer implements an "external object" pickler which keeps
20184220fc09SJason Kirtland      key context-sensitive objects, including engines, sessions,
20194220fc09SJason Kirtland      metadata, Tables/Columns, and mappers, outside of the pickle
20204220fc09SJason Kirtland      stream, and can later restore the pickle using any
20214220fc09SJason Kirtland      engine/metadata/session provider. This is used not for
20224220fc09SJason Kirtland      pickling regular object instances, which are pickleable
20234220fc09SJason Kirtland      without any special logic, but for pickling expression objects
20244220fc09SJason Kirtland      and full Query objects, such that all mapper/engine/session
2025da59591aSMike Bayer      dependencies can be restored at unpickle time.
2026da59591aSMike Bayer
2027e6141ef8SMike Bayer- oracle
20284220fc09SJason Kirtland    - Wrote a docstring for Oracle dialect. Apparently that Ohloh
20294220fc09SJason Kirtland      "few source code comments" label is starting to sting :).
2030da59591aSMike Bayer
20314220fc09SJason Kirtland    - Removed FIRST_ROWS() optimize flag when using LIMIT/OFFSET,
20324220fc09SJason Kirtland      can be reenabled with optimize_limits=True create_engine()
20334220fc09SJason Kirtland      flag.  [ticket:536]
2034e6141ef8SMike Bayer
2035da59591aSMike Bayer- bugfixes and behavioral changes
2036da59591aSMike Bayer- orm
20374220fc09SJason Kirtland    - "not equals" comparisons of simple many-to-one relation to an
20384220fc09SJason Kirtland      instance will not drop into an EXISTS clause and will compare
20394220fc09SJason Kirtland      foreign key columns instead.
20404220fc09SJason Kirtland
20414220fc09SJason Kirtland    - Removed not-really-working use cases of comparing a collection
20424220fc09SJason Kirtland      to an iterable. Use contains() to test for collection
20434220fc09SJason Kirtland      membership.
20444220fc09SJason Kirtland
20454220fc09SJason Kirtland    - Improved the behavior of aliased() objects such that they more
20464220fc09SJason Kirtland      accurately adapt the expressions generated, which helps
20474220fc09SJason Kirtland      particularly with self-referential comparisons. [ticket:1171]
20484220fc09SJason Kirtland
20494220fc09SJason Kirtland    - Fixed bug involving primaryjoin/secondaryjoin conditions
20504220fc09SJason Kirtland      constructed from class-bound attributes (as often occurs when
20514220fc09SJason Kirtland      using declarative), which later would be inappropriately
20524220fc09SJason Kirtland      aliased by Query, particularly with the various EXISTS based
20534220fc09SJason Kirtland      comparators.
20544220fc09SJason Kirtland
20554220fc09SJason Kirtland    - Fixed bug when using multiple query.join() with an
20564220fc09SJason Kirtland      aliased-bound descriptor which would lose the left alias.
20574220fc09SJason Kirtland
20584220fc09SJason Kirtland    - Improved weakref identity map memory management to no longer
20594220fc09SJason Kirtland      require mutexing, resurrects garbage collected instance on a
20604220fc09SJason Kirtland      lazy basis for an InstanceState with pending changes.
20614220fc09SJason Kirtland
20624220fc09SJason Kirtland    - InstanceState object now removes circular references to itself
20634220fc09SJason Kirtland      upon disposal to keep it outside of cyclic garbage collection.
20644220fc09SJason Kirtland
20654220fc09SJason Kirtland    - relation() won't hide unrelated ForeignKey errors inside of
20664220fc09SJason Kirtland      the "please specify primaryjoin" message when determining join
2067c9591657SJason Kirtland      condition.
2068c9591657SJason Kirtland
20694220fc09SJason Kirtland    - Fixed bug in Query involving order_by() in conjunction with
20704220fc09SJason Kirtland      multiple aliases of the same class (will add tests in
20714220fc09SJason Kirtland      [ticket:1218])
20724220fc09SJason Kirtland
20734220fc09SJason Kirtland    - When using Query.join() with an explicit clause for the ON
20744220fc09SJason Kirtland      clause, the clause will be aliased in terms of the left side
20754220fc09SJason Kirtland      of the join, allowing scenarios like query(Source).
20764220fc09SJason Kirtland      from_self().join((Dest, Source.id==Dest.source_id)) to work
20774220fc09SJason Kirtland      properly.
20784220fc09SJason Kirtland
20794220fc09SJason Kirtland    - polymorphic_union() function respects the "key" of each Column
20804220fc09SJason Kirtland      if they differ from the column's name.
20814220fc09SJason Kirtland
20824220fc09SJason Kirtland    - Repaired support for "passive-deletes" on a many-to-one
20834220fc09SJason Kirtland      relation() with "delete" cascade.  [ticket:1183]
20844220fc09SJason Kirtland
20854220fc09SJason Kirtland    - Fixed bug in composite types which prevented a primary-key
20864220fc09SJason Kirtland      composite type from being mutated [ticket:1213].
20874220fc09SJason Kirtland
20884220fc09SJason Kirtland    - Added more granularity to internal attribute access, such that
20894220fc09SJason Kirtland      cascade and flush operations will not initialize unloaded
20904220fc09SJason Kirtland      attributes and collections, leaving them intact for a
20914220fc09SJason Kirtland      lazy-load later on. Backref events still initialize attrbutes
20924220fc09SJason Kirtland      and collections for pending instances.  [ticket:1202]
2093c9591657SJason Kirtland
2094a20222fcSMike Bayer- sql
20954220fc09SJason Kirtland    - Simplified the check for ResultProxy "autoclose without
20964220fc09SJason Kirtland      results" to be based solely on presence of
20974220fc09SJason Kirtland      cursor.description. All the regexp-based guessing about
20984220fc09SJason Kirtland      statements returning rows has been removed [ticket:1212].
20994220fc09SJason Kirtland
21004220fc09SJason Kirtland    - Direct execution of a union() construct will properly set up
21014220fc09SJason Kirtland      result-row processing.  [ticket:1194]
21024220fc09SJason Kirtland
21034220fc09SJason Kirtland    - The internal notion of an "OID" or "ROWID" column has been
21044220fc09SJason Kirtland      removed. It's basically not used by any dialect, and the
21054220fc09SJason Kirtland      possibility of its usage with psycopg2's cursor.lastrowid is
21064220fc09SJason Kirtland      basically gone now that INSERT..RETURNING is available.
21074220fc09SJason Kirtland
21084220fc09SJason Kirtland    - Removed "default_order_by()" method on all FromClause objects.
21094220fc09SJason Kirtland
21104220fc09SJason Kirtland    - Repaired the table.tometadata() method so that a passed-in
21114220fc09SJason Kirtland      schema argument is propagated to ForeignKey constructs.
21124220fc09SJason Kirtland
21134220fc09SJason Kirtland    - Slightly changed behavior of IN operator for comparing to
21144220fc09SJason Kirtland      empty collections. Now results in inequality comparison
21154220fc09SJason Kirtland      against self. More portable, but breaks with stored procedures
21164220fc09SJason Kirtland      that aren't pure functions.
211711619ad8SAnts Aasma
21183bbf8037SMike Bayer- oracle
21194220fc09SJason Kirtland    - Setting the auto_convert_lobs to False on create_engine() will
21204220fc09SJason Kirtland      also instruct the OracleBinary type to return the cx_oracle
21214220fc09SJason Kirtland      LOB object unchanged.
2122ecf22b39SMike Bayer
2123c9591657SJason Kirtland- mysql
21244220fc09SJason Kirtland    - Fixed foreign key reflection in the edge case where a Table's
21254220fc09SJason Kirtland      explicit schema= is the same as the schema (database) the
21264220fc09SJason Kirtland      connection is attached to.
2127ecf22b39SMike Bayer
21284220fc09SJason Kirtland    - No longer expects include_columns in table reflection to be
21294220fc09SJason Kirtland      lower case.
21303f1e5e21SMike Bayer
21319b360ddaSMike Bayer- ext
21324220fc09SJason Kirtland    - Fixed bug preventing declarative-bound "column" objects from
21334220fc09SJason Kirtland      being used in column_mapped_collection(). [ticket:1174]
21349b360ddaSMike Bayer
2135ed3e3f25SMike Bayer- misc
21364220fc09SJason Kirtland    - util.flatten_iterator() func doesn't interpret strings with
21374220fc09SJason Kirtland      __iter__() methods as iterators, such as in pypy
21384220fc09SJason Kirtland      [ticket:1077].
21394220fc09SJason Kirtland
2140d47a4697SMike Bayer0.5.0rc2
2141d47a4697SMike Bayer========
21429632a752SMike Bayer- orm
21438e531297SJason Kirtland    - Fixed bug involving read/write relation()s that contain
21448e531297SJason Kirtland      literal or other non-column expressions within their
21458e531297SJason Kirtland      primaryjoin condition equated to a foreign key column.
21468e531297SJason Kirtland
21478e531297SJason Kirtland    - "non-batch" mode in mapper(), a feature which allows mapper
21488e531297SJason Kirtland      extension methods to be called as each instance is
21498e531297SJason Kirtland      updated/inserted, now honors the insert order of the objects
21508e531297SJason Kirtland      given.
21518e531297SJason Kirtland
21528e531297SJason Kirtland    - Fixed RLock-related bug in mapper which could deadlock upon
21538e531297SJason Kirtland      reentrant mapper compile() calls, something that occurs when
21548e531297SJason Kirtland      using declarative constructs inside of ForeignKey objects.
215529a6af6dSJason Kirtland
215629a6af6dSJason Kirtland    - ScopedSession.query_property now accepts a query_cls factory,
215729a6af6dSJason Kirtland      overriding the session's configured query_cls.
215829a6af6dSJason Kirtland
21598e531297SJason Kirtland    - Fixed shared state bug interfering with ScopedSession.mapper's
21608e531297SJason Kirtland      ability to apply default __init__ implementations on object
21618e531297SJason Kirtland      subclasses.
21628e531297SJason Kirtland
21635f75197eSMike Bayer    - Fixed up slices on Query (i.e. query[x:y]) to work properly
21645f75197eSMike Bayer      for zero length slices, slices with None on either end.
21655f75197eSMike Bayer      [ticket:1177]
21665f75197eSMike Bayer
21676122c3adSMike Bayer    - Added an example illustrating Celko's "nested sets" as a 
21686122c3adSMike Bayer      SQLA mapping.
2169a9a4da62SMike Bayer    
2170a9a4da62SMike Bayer    - contains_eager() with an alias argument works even when 
2171a9a4da62SMike Bayer      the alias is embedded in a SELECT, as when sent to the
2172a9a4da62SMike Bayer      Query via query.select_from().
2173a9a4da62SMike Bayer      
2174a9a4da62SMike Bayer    - contains_eager() usage is now compatible with a Query that
2175a9a4da62SMike Bayer      also contains a regular eager load and limit/offset, in that
2176a9a4da62SMike Bayer      the columns are added to the Query-generated subquery.
2177a9a4da62SMike Bayer      [ticket:1180]
21786122c3adSMike Bayer      
21796122c3adSMike Bayer    - session.execute() will execute a Sequence object passed to
21806122c3adSMike Bayer      it (regression from 0.4).
21816122c3adSMike Bayer    
21826122c3adSMike Bayer    - Removed the "raiseerror" keyword argument from object_mapper()
21836122c3adSMike Bayer      and class_mapper().  These functions raise in all cases
21846122c3adSMike Bayer      if the given class/instance is not mapped.
21854c53406cSAnts Aasma
21864c53406cSAnts Aasma    - Fixed session.transaction.commit() on a autocommit=False
21874c53406cSAnts Aasma      session not starting a new transaction.
2188abe17984SMike Bayer      
2189abe17984SMike Bayer    - Some adjustments to Session.identity_map's weak referencing
2190abe17984SMike Bayer      behavior to reduce asynchronous GC side effects.
21917005a9a4SMike Bayer    
21927005a9a4SMike Bayer    - Adjustment to Session's post-flush accounting of newly
21937005a9a4SMike Bayer      "clean" objects to better protect against operating on
21947005a9a4SMike Bayer      objects as they're asynchronously gc'ed. [ticket:1182]
21951127b10bSMike Bayer    
2196d47a4697SMike Bayer- sql
21978e531297SJason Kirtland    - column.in_(someselect) can now be used as a columns-clause
21988e531297SJason Kirtland      expression without the subquery bleeding into the FROM clause
21998e531297SJason Kirtland      [ticket:1074]
22001127b10bSMike Bayer      
22018d2fd5f8SMike Bayer- sqlite
22028e531297SJason Kirtland    - Overhauled SQLite date/time bind/result processing to use
22038e531297SJason Kirtland      regular expressions and format strings, rather than
22048e531297SJason Kirtland      strptime/strftime, to generically support pre-1900 dates,
22058e531297SJason Kirtland      dates with microseconds.  [ticket:968]
22068e531297SJason Kirtland
22074ca89fd3SMike Bayer    - String's (and Unicode's, UnicodeText's, etc.) convert_unicode 
22084ca89fd3SMike Bayer      logic disabled in the sqlite dialect, to adjust for pysqlite 
22094ca89fd3SMike Bayer      2.5.0's new requirement that only Python unicode objects are 
22104ca89fd3SMike Bayer      accepted;
22114ca89fd3SMike Bayer      http://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
22124ca89fd3SMike Bayer      
2213bcd7c81aSJason Kirtland- mysql
2214bcd7c81aSJason Kirtland    - Temporary tables are now reflectable.
2215bcd7c81aSJason Kirtland
2216ff3df488SMike Bayer- oracle
2217ff3df488SMike Bayer    - Oracle will detect string-based statements which contain 
2218ff3df488SMike Bayer      comments at the front before a SELECT as SELECT statements.
2219ff3df488SMike Bayer      [ticket:1187]
2220a20222fcSMike Bayer
222101de7110SMike Bayer0.5.0rc1
22224cd19027SMike Bayer========
222347f1d414SJason Kirtland
22244cd19027SMike Bayer- orm
2225dcad710dSAnts Aasma    - Query now has delete() and update(values) methods. This allows
2226dcad710dSAnts Aasma      to perform bulk deletes/updates with the Query object.
2227dcad710dSAnts Aasma
222847f1d414SJason Kirtland    - The RowTuple object returned by Query(*cols) now features
222947f1d414SJason Kirtland      keynames which prefer mapped attribute names over column keys,
223047f1d414SJason Kirtland      column keys over column names, i.e.  Query(Class.foo,
223147f1d414SJason Kirtland      Class.bar) will have names "foo" and "bar" even if those are
223247f1d414SJason Kirtland      not the names of the underlying Column objects.  Direct Column
223347f1d414SJason Kirtland      objects such as Query(table.c.col) will return the "key"
223447f1d414SJason Kirtland      attribute of the Column.
223547f1d414SJason Kirtland
223637d59c1bSMike Bayer    - Added scalar() and value() methods to Query, each return a
223737d59c1bSMike Bayer      single scalar value.  scalar() takes no arguments and is
223837d59c1bSMike Bayer      roughly equivalent to first()[0], value()
223937d59c1bSMike Bayer      takes a single column expression and is roughly equivalent to
224037d59c1bSMike Bayer      values(expr).next()[0].
224137d59c1bSMike Bayer      
224247f1d414SJason Kirtland    - Improved the determination of the FROM clause when placing SQL
224347f1d414SJason Kirtland      expressions in the query() list of entities.  In particular
224447f1d414SJason Kirtland      scalar subqueries should not "leak" their inner FROM objects
224547f1d414SJason Kirtland      out into the enclosing query.
224647f1d414SJason Kirtland
2247ee736661SJason Kirtland    - Joins along a relation() from a mapped class to a mapped
224847f1d414SJason Kirtland      subclass, where the mapped subclass is configured with single
224947f1d414SJason Kirtland      table inheritance, will include an IN clause which limits the
22503f8914b4SMichael Trier      subtypes of the joined class to those requested, within the ON
225147f1d414SJason Kirtland      clause of the join.  This takes effect for eager load joins as
225247f1d414SJason Kirtland      well as query.join().  Note that in some scenarios the IN
225347f1d414SJason Kirtland      clause will appear in the WHERE clause of the query as well
225447f1d414SJason Kirtland      since this discrimination has multiple trigger points.
2255ee736661SJason Kirtland
22563829b89dSMike Bayer    - AttributeExtension has been refined such that the event
22573f8914b4SMichael Trier      is fired before the mutation actually occurs.  Additionally,
22583e25e6e6SMike Bayer      the append() and set() methods must now return the given value,
22593e25e6e6SMike Bayer      which is used as the value to be used in the mutation operation.
22603e25e6e6SMike Bayer      This allows creation of validating AttributeListeners which
22613e25e6e6SMike Bayer      raise before the action actually occurs, and which can change
22623e25e6e6SMike Bayer      the given value into something else before its used.
22633829b89dSMike Bayer
22643829b89dSMike Bayer    - column_property(), composite_property(), and relation() now 
22653829b89dSMike Bayer      accept a single or list of AttributeExtensions using the 
22663829b89dSMike Bayer      "extension" keyword argument.
2267c336ac60SMike Bayer
2268c336ac60SMike Bayer    - query.order_by().get() silently drops the "ORDER BY" from 
2269c336ac60SMike Bayer      the query issued by GET but does not raise an exception.
22703829b89dSMike Bayer      
22713829b89dSMike Bayer    - Added a Validator AttributeExtension, as well as a 
22723829b89dSMike Bayer      @validates decorator which is used in a similar fashion
22733829b89dSMike Bayer      as @reconstructor, and marks a method as validating
22743829b89dSMike Bayer      one or more mapped attributes.
22753e25e6e6SMike Bayer      
2276ee736661SJason Kirtland    - class.someprop.in_() raises NotImplementedError pending the
2277ee736661SJason Kirtland      implementation of "in_" for relation [ticket:1140]
2278ee736661SJason Kirtland
2279ee736661SJason Kirtland    - Fixed primary key update for many-to-many collections where
2280ee736661SJason Kirtland      the collection had not been loaded yet [ticket:1127]
2281ee736661SJason Kirtland
2282af342bbaSMike Bayer    - Fixed bug whereby deferred() columns with a group in conjunction
2283af342bbaSMike Bayer      with an otherwise unrelated synonym() would produce 
2284af342bbaSMike Bayer      an AttributeError during deferred load.
2285af342bbaSMike Bayer      
2286ee736661SJason Kirtland    - The before_flush() hook on SessionExtension takes place before
2287ee736661SJason Kirtland      the list of new/dirty/deleted is calculated for the final
2288ee736661SJason Kirtland      time, allowing routines within before_flush() to further
2289ee736661SJason Kirtland      change the state of the Session before the flush proceeds.
2290ee736661SJason Kirtland      [ticket:1128]
2291ee736661SJason Kirtland
229266dd5d79SMike Bayer    - The "extension" argument to Session and others can now
229366dd5d79SMike Bayer      optionally be a list, supporting events sent to multiple
229466dd5d79SMike Bayer      SessionExtension instances.  Session places SessionExtensions
229566dd5d79SMike Bayer      in Session.extensions.
229666dd5d79SMike Bayer      
2297ee736661SJason Kirtland    - Reentrant calls to flush() raise an error.  This also serves
2298ee736661SJason Kirtland      as a rudimentary, but not foolproof, check against concurrent
2299ee736661SJason Kirtland      calls to Session.flush().
2300ee736661SJason Kirtland
230147f1d414SJason Kirtland    - Improved the behavior of query.join() when joining to
230247f1d414SJason Kirtland      joined-table inheritance subclasses, using explicit join
230347f1d414SJason Kirtland      criteria (i.e. not on a relation).
230447f1d414SJason Kirtland
23053f8914b4SMichael Trier    - @orm.attributes.on_reconstitute and
23062d4908e8SJason Kirtland      MapperExtension.on_reconstitute have been renamed to
23072d4908e8SJason Kirtland      @orm.reconstructor and MapperExtension.reconstruct_instance
23082d4908e8SJason Kirtland
23092d4908e8SJason Kirtland    - Fixed @reconstructor hook for subclasses which inherit from a
231047f1d414SJason Kirtland      base class.  [ticket:1129]
231147f1d414SJason Kirtland
231247f1d414SJason Kirtland    - The composite() property type now supports a
231347f1d414SJason Kirtland      __set_composite_values__() method on the composite class which
231447f1d414SJason Kirtland      is required if the class represents state using attribute
231547f1d414SJason Kirtland      names other than the column's keynames; default-generated
231647f1d414SJason Kirtland      values now get populated properly upon flush.  Also,
2317