xref: /sqlalchemy/CHANGES (revision c4506b8c)
14a6afd46SMike Bayer-*- coding: utf-8; fill-column: 68 -*-
24a6afd46SMike Bayer
3c86c9be7SJason Kirtland=======
4c86c9be7SJason KirtlandCHANGES
5c86c9be7SJason Kirtland=======
6c4506b8cSMike Bayer0.7.5
7c4506b8cSMike Bayer=====
8c4506b8cSMike Bayer- orm
9c4506b8cSMike Bayer  - [bug] Fixed bug whereby hybrid_property didn't 
10c4506b8cSMike Bayer    work as a kw arg in any(), has().
11c4506b8cSMike Bayer
12438e63dbSMike Bayer0.7.4
13438e63dbSMike Bayer=====
14eeafd0f5SMike Bayer- orm
15d1cc7e75SMike Bayer  - [bug] Fixed backref behavior when "popping" the 
16d1cc7e75SMike Bayer    value off of a many-to-one in response to 
17d1cc7e75SMike Bayer    a removal from a stale one-to-many - the operation
18d1cc7e75SMike Bayer    is skipped, since the many-to-one has since
19d1cc7e75SMike Bayer    been updated.  [ticket:2315]
20d1cc7e75SMike Bayer
21d1cc7e75SMike Bayer  - [bug] After some years of not doing this, added
22d1cc7e75SMike Bayer    more granularity to the "is X a parent of Y" 
23d1cc7e75SMike Bayer    functionality, which is used when determining
24d1cc7e75SMike Bayer    if the FK on "Y" needs to be "nulled out" as well
25d1cc7e75SMike Bayer    as if "Y" should be deleted with delete-orphan
26d1cc7e75SMike Bayer    cascade.   The test now takes into account the
27d1cc7e75SMike Bayer    Python identity of the parent as well its identity 
28d1cc7e75SMike Bayer    key, to see if the last known parent of Y is
29d1cc7e75SMike Bayer    definitely X.   If a decision
30d1cc7e75SMike Bayer    can't be made, a StaleDataError is raised.  The
31d1cc7e75SMike Bayer    conditions where this error is raised are fairly
32d1cc7e75SMike Bayer    rare, requiring that the previous parent was
33d1cc7e75SMike Bayer    garbage collected, and previously
34d1cc7e75SMike Bayer    could very well inappropriately update/delete
35d1cc7e75SMike Bayer    a record that's since moved onto a new parent,
36d1cc7e75SMike Bayer    though there may be some cases where 
37d1cc7e75SMike Bayer    "silent success" occurred previously that will now 
38d1cc7e75SMike Bayer    raise in the face of ambiguity.
39d1cc7e75SMike Bayer    Expiring "Y" resets the "parent" tracker, meaning
40d1cc7e75SMike Bayer    X.remove(Y) could then end up deleting Y even 
41d1cc7e75SMike Bayer    if X is stale, but this is the same behavior
42d1cc7e75SMike Bayer    as before; it's advised to expire X also in that 
43d1cc7e75SMike Bayer    case.  [ticket:2264]
44d1cc7e75SMike Bayer
45d1cc7e75SMike Bayer  - [bug] fixed inappropriate evaluation of user-mapped
46d1cc7e75SMike Bayer    object in a boolean context within query.get()
47d1cc7e75SMike Bayer    [ticket:2310].  Also in 0.6.9.
48d1cc7e75SMike Bayer
49d1cc7e75SMike Bayer  - [bug] Added missing comma to PASSIVE_RETURN_NEVER_SET
50d1cc7e75SMike Bayer    symbol [ticket:2304]
51d1cc7e75SMike Bayer
52d1cc7e75SMike Bayer  - [bug] Cls.column.collate("some collation") now
53d1cc7e75SMike Bayer    works.  [ticket:1776]  Also in 0.6.9
54d1cc7e75SMike Bayer
55d1cc7e75SMike Bayer  - [bug] the value of a composite attribute is now
56d1cc7e75SMike Bayer    expired after an insert or update operation, instead
57d1cc7e75SMike Bayer    of regenerated in place.  This ensures that a 
58d1cc7e75SMike Bayer    column value which is expired within a flush
59d1cc7e75SMike Bayer    will be loaded first, before the composite
60d1cc7e75SMike Bayer    is regenerated using that value.  [ticket:2309]
61d1cc7e75SMike Bayer
62d1cc7e75SMike Bayer  - [bug] The fix in [ticket:2309] also emits the
63d1cc7e75SMike Bayer    "refresh" event when the composite value is
64d1cc7e75SMike Bayer    loaded on access, even if all column
65d1cc7e75SMike Bayer    values were already present, as is appropriate.
66d1cc7e75SMike Bayer    This fixes the "mutable" extension which relies
67d1cc7e75SMike Bayer    upon the "load" event to ensure the _parents 
68d1cc7e75SMike Bayer    dictionary is up to date, fixes [ticket:2308].
69d1cc7e75SMike Bayer    Thanks to Scott Torborg for the test case here.
70d1cc7e75SMike Bayer
71d1cc7e75SMike Bayer  - [bug] Fixed bug whereby a subclass of a subclass
72d1cc7e75SMike Bayer    using concrete inheritance in conjunction with
73d1cc7e75SMike Bayer    the new ConcreteBase or AbstractConcreteBase
74d1cc7e75SMike Bayer    would fail to apply the subclasses deeper than
75d1cc7e75SMike Bayer    one level to the "polymorphic loader" of each
76d1cc7e75SMike Bayer    base  [ticket:2312]
77d1cc7e75SMike Bayer
78d1cc7e75SMike Bayer  - [bug] Fixed bug whereby a subclass of a subclass
79d1cc7e75SMike Bayer    using the new AbstractConcreteBase would fail
80d1cc7e75SMike Bayer    to acquire the correct "base_mapper" attribute
81d1cc7e75SMike Bayer    when the "base" mapper was generated, thereby
82d1cc7e75SMike Bayer    causing failures later on.  [ticket:2312]
83d1cc7e75SMike Bayer
84d1cc7e75SMike Bayer  - [bug] Fixed bug whereby column_property() created
85d1cc7e75SMike Bayer    against ORM-level column could be treated as
86d1cc7e75SMike Bayer    a distinct entity when producing certain
87d1cc7e75SMike Bayer    kinds of joined-inh joins.  [ticket:2316]
88d1cc7e75SMike Bayer
89d1cc7e75SMike Bayer  - [bug] Fixed the error formatting raised when 
90d1cc7e75SMike Bayer    a tuple is inadvertently passed to session.query()
91d1cc7e75SMike Bayer    [ticket:2297].  Also in 0.6.9.
92d1cc7e75SMike Bayer
93d1cc7e75SMike Bayer  - [bug] Calls to query.join() to a single-table
94d1cc7e75SMike Bayer    inheritance subclass are now tracked, and
95d1cc7e75SMike Bayer    are used to eliminate the additional WHERE..
96d1cc7e75SMike Bayer    IN criterion normally tacked on with single
97d1cc7e75SMike Bayer    table inheritance, since the join should
98d1cc7e75SMike Bayer    accommodate it.  This allows OUTER JOIN
99d1cc7e75SMike Bayer    to a single table subclass to produce
100d1cc7e75SMike Bayer    the correct results, and overall will produce
101d1cc7e75SMike Bayer    fewer WHERE criterion when dealing with 
102d1cc7e75SMike Bayer    single table inheritance joins.
103d1cc7e75SMike Bayer    [ticket:2328]
104252acd50SMike Bayer
1057f68a3a5SMike Bayer  - [bug] __table_args__ can now be passed as 
1067f68a3a5SMike Bayer    an empty tuple as well as an empty dict.
1077f68a3a5SMike Bayer    [ticket:2339].  Thanks to Fayaz Yusuf Khan
1087f68a3a5SMike Bayer    for the patch.
1097f68a3a5SMike Bayer
110b3fa5d03SMike Bayer  - [bug] Updated warning message when setting
111b3fa5d03SMike Bayer    delete-orphan without delete to no longer
112b3fa5d03SMike Bayer    refer to 0.6, as we never got around to 
113b3fa5d03SMike Bayer    upgrading this to an exception.  Ideally
114b3fa5d03SMike Bayer    this might be better as an exception but
115b3fa5d03SMike Bayer    it's not critical either way.  [ticket:2325]
116b3fa5d03SMike Bayer
117d1cc7e75SMike Bayer  - [feature] polymorphic_on now accepts many
118d1cc7e75SMike Bayer    new kinds of values:
119d1cc7e75SMike Bayer
120d1cc7e75SMike Bayer      - standalone expressions that aren't
121d1cc7e75SMike Bayer        otherwise mapped
122d1cc7e75SMike Bayer      - column_property() objects
123d1cc7e75SMike Bayer      - string names of any column_property()
124d1cc7e75SMike Bayer        or attribute name of a mapped Column
125d1cc7e75SMike Bayer
126d1cc7e75SMike Bayer    The docs include an example using 
127d1cc7e75SMike Bayer    the case() construct, which is likely to be
128d1cc7e75SMike Bayer    a common constructed used here.
129d1cc7e75SMike Bayer    [ticket:2345] and part of [ticket:2238]
130d1cc7e75SMike Bayer
13133ddb48dSMike Bayer    Standalone expressions in polymorphic_on
13233ddb48dSMike Bayer    propagate to single-table inheritance
13333ddb48dSMike Bayer    subclasses so that they are used in the
13433ddb48dSMike Bayer    WHERE /JOIN clause to limit rows to that
13533ddb48dSMike Bayer    subclass as is the usual behavior.
13633ddb48dSMike Bayer
137a8dc787fSMike Bayer  - [feature] IdentitySet supports the - operator
138a8dc787fSMike Bayer    as the same as difference(), handy when dealing 
139a8dc787fSMike Bayer    with Session.dirty etc. [ticket:2301]
140a8dc787fSMike Bayer
1417ebcd26fSMike Bayer  - [feature] Added new value for Column autoincrement
1427ebcd26fSMike Bayer    called "ignore_fk", can be used to force autoincrement
1437ebcd26fSMike Bayer    on a column that's still part of a ForeignKeyConstraint.
1447ebcd26fSMike Bayer    New example in the relationship docs illustrates
1457ebcd26fSMike Bayer    its use.
1467ebcd26fSMike Bayer
147f79c9a22SMike Bayer  - [bug] Fixed bug in get_history() when referring
148f79c9a22SMike Bayer    to a composite attribute that has no value;
149f79c9a22SMike Bayer    added coverage for get_history() regarding 
150f79c9a22SMike Bayer    composites which is otherwise just a userland
151f79c9a22SMike Bayer    function.
152f79c9a22SMike Bayer
153a708d0fbSMike Bayer- sql
15469914608SMike Bayer   - [bug] related to [ticket:2316], made some 
15569914608SMike Bayer     adjustments to the change from [ticket:2261]
15669914608SMike Bayer     regarding the "from" list on a select(). The
15769914608SMike Bayer     _froms collection is no longer memoized, as this
15869914608SMike Bayer     simplifies various use cases and removes the 
15969914608SMike Bayer     need for a "warning" if a column is attached
16069914608SMike Bayer     to a table after it was already used in an 
16169914608SMike Bayer     expression - the select() construct will now
162d1cc7e75SMike Bayer     always produce the correct expression.
16369914608SMike Bayer     There's probably no real-world
16469914608SMike Bayer     performance hit here; select() objects are 
16569914608SMike Bayer     almost always made ad-hoc, and systems that 
16669914608SMike Bayer     wish to optimize the re-use of a select()
16769914608SMike Bayer     would be using the "compiled_cache" feature.
16869914608SMike Bayer     A hit which would occur when calling select.bind
16969914608SMike Bayer     has been reduced, but the vast majority
17069914608SMike Bayer     of users shouldn't be using "bound metadata"
17169914608SMike Bayer     anyway :).
17269914608SMike Bayer
173e7b612a6SMike Bayer   - [feature] The update() construct can now accommodate
174e7b612a6SMike Bayer     multiple tables in the WHERE clause, which will
175e7b612a6SMike Bayer     render an "UPDATE..FROM" construct, recognized by 
176e7b612a6SMike Bayer     Postgresql and MSSQL.  When compiled on MySQL,
177e7b612a6SMike Bayer     will instead generate "UPDATE t1, t2, ..".  MySQL
178e7b612a6SMike Bayer     additionally can render against multiple tables in the
179e7b612a6SMike Bayer     SET clause, if Column objects are used as keys
180e7b612a6SMike Bayer     in the "values" parameter or generative method.
181e7b612a6SMike Bayer     [ticket:2166] [ticket:1944]
182e7b612a6SMike Bayer
18383016514SMike Bayer   - [feature] Added accessor to types called "python_type",
184a708d0fbSMike Bayer     returns the rudimentary Python type object
185a708d0fbSMike Bayer     for a particular TypeEngine instance, if known,
186a708d0fbSMike Bayer     else raises NotImplementedError.  [ticket:77]
187a708d0fbSMike Bayer
188c0c42af4SMike Bayer   - [bug] further tweak to the fix from [ticket:2261],
189c0c42af4SMike Bayer     so that generative methods work a bit better
190c0c42af4SMike Bayer     off of cloned (this is almost a non-use case though).
191c0c42af4SMike Bayer     In particular this allows with_only_columns()
192c0c42af4SMike Bayer     to behave more consistently.   Added additional
193c0c42af4SMike Bayer     documentation to with_only_columns() to clarify
194c0c42af4SMike Bayer     expected behavior, which changed as a result
195c0c42af4SMike Bayer     of [ticket:2261].  [ticket:2319]
196c0c42af4SMike Bayer
197632043bcSMike Bayer- engine
198632043bcSMike Bayer  - [bug] Fixed bug whereby transaction.rollback()
199632043bcSMike Bayer    would throw an error on an invalidated 
200632043bcSMike Bayer    connection if the transaction were a 
201632043bcSMike Bayer    two-phase or savepoint transaction.
202632043bcSMike Bayer    For plain transactions, rollback() is a no-op
203632043bcSMike Bayer    if the connection is invalidated, so while
204632043bcSMike Bayer    it wasn't 100% clear if it should be a no-op,
205632043bcSMike Bayer    at least now the interface is consistent.
206632043bcSMike Bayer    [ticket:2317]
207632043bcSMike Bayer
20883016514SMike Bayer- schema
20983016514SMike Bayer  - [feature] Added new support for remote "schemas":
21083016514SMike Bayer    - MetaData() accepts "schema" and "quote_schema"
21183016514SMike Bayer      arguments, which will be applied to the same-named
21283016514SMike Bayer      arguments of a Table
21383016514SMike Bayer      or Sequence which leaves these at their default
21483016514SMike Bayer      of ``None``.
21583016514SMike Bayer    - Sequence accepts "quote_schema" argument
21683016514SMike Bayer    - tometadata() for Table will use the "schema"
21783016514SMike Bayer      of the incoming MetaData for the new Table
21883016514SMike Bayer      if the schema argument is explicitly "None"
21983016514SMike Bayer    - Added CreateSchema and DropSchema DDL
22083016514SMike Bayer      constructs - these accept just the string
22183016514SMike Bayer      name of a schema and a "quote" flag.
22283016514SMike Bayer    - When using default "schema" with MetaData,
22383016514SMike Bayer      ForeignKey will also assume the "default" schema
22483016514SMike Bayer      when locating remote table.  This allows the "schema"
22583016514SMike Bayer      argument on MetaData to be applied to any 
22683016514SMike Bayer      set of Table objects that otherwise don't have 
22783016514SMike Bayer      a "schema".
22883016514SMike Bayer    - a "has_schema" method has been implemented
22983016514SMike Bayer      on dialect, but only works on Postgresql so far.
23083016514SMike Bayer    Courtesy Manlio Perillo, [ticket:1679]
23183016514SMike Bayer
23281945d7aSMike Bayer  - [feature] The "extend_existing" flag on Table
23381945d7aSMike Bayer    now allows for the reflection process to take
23481945d7aSMike Bayer    effect for a Table object that's already been 
23581945d7aSMike Bayer    defined; when autoload=True and extend_existing=True
23681945d7aSMike Bayer    are both set, the full set of columns will be
23781945d7aSMike Bayer    reflected from the Table which will then 
23881945d7aSMike Bayer    *overwrite* those columns already present,
23981945d7aSMike Bayer    rather than no activity occurring.  Columns that
24081945d7aSMike Bayer    are present directly in the autoload run
24181945d7aSMike Bayer    will be used as always, however.
24281945d7aSMike Bayer    [ticket:1410]
24381945d7aSMike Bayer
244beef2b5aSMike Bayer  - [bug] Fixed bug whereby TypeDecorator would
245beef2b5aSMike Bayer    return a stale value for _type_affinity, when
246beef2b5aSMike Bayer    using a TypeDecorator that "switches" types,
247beef2b5aSMike Bayer    like the CHAR/UUID type.
248beef2b5aSMike Bayer
249896bc4c5SMike Bayer  - [bug] Fixed bug whereby "order_by='foreign_key'"
250896bc4c5SMike Bayer    option to Inspector.get_table_names 
251896bc4c5SMike Bayer    wasn't implementing the sort properly, replaced
252896bc4c5SMike Bayer    with the existing sort algorithm
253896bc4c5SMike Bayer
254133a0b24SMike Bayer  - [bug] the "name" of a column-level CHECK constraint,
255133a0b24SMike Bayer    if present, is now rendered in the CREATE TABLE 
256133a0b24SMike Bayer    statement using "CONSTRAINT <name> CHECK <expression>". 
257133a0b24SMike Bayer    [ticket:2305]
258133a0b24SMike Bayer
2593867ea9dSMike Bayer- pyodbc
2603867ea9dSMike Bayer   - [bug] pyodbc-based dialects now parse the 
2613867ea9dSMike Bayer     pyodbc accurately as far as observed
2623867ea9dSMike Bayer     pyodbc strings, including such gems
2633867ea9dSMike Bayer     as "py3-3.0.1-beta4" [ticket:2318]
2643867ea9dSMike Bayer
265e6a5ea8fSMike Bayer- postgresql
266e6a5ea8fSMike Bayer   - [bug] Postgresql dialect memoizes that an ENUM of a 
267e6a5ea8fSMike Bayer     particular name was processed
268e6a5ea8fSMike Bayer     during a create/drop sequence.  This allows
269e6a5ea8fSMike Bayer     a create/drop sequence to work without any
270e6a5ea8fSMike Bayer     calls to "checkfirst", and also means with
271e6a5ea8fSMike Bayer     "checkfirst" turned on it only needs to 
272e6a5ea8fSMike Bayer     check for the ENUM once.  [ticket:2311]
273e6a5ea8fSMike Bayer
274b854074cSMike Bayer   - [feature] Added create_type constructor argument 
275b854074cSMike Bayer     to pg.ENUM.  When False, no CREATE/DROP or 
276b854074cSMike Bayer     checking for the type will be performed as part
277b854074cSMike Bayer     of a table create/drop event; only the 
278b854074cSMike Bayer     create()/drop)() methods called directly
279b854074cSMike Bayer     will do this.  Helps with Alembic "offline"
280b854074cSMike Bayer     scripts.
281b854074cSMike Bayer
2822fca3c8eSMike Bayer- mssql
28358e692d7SMike Bayer  - [feature] lifted the restriction on SAVEPOINT
28458e692d7SMike Bayer    for SQL Server.  All tests pass using it,
28558e692d7SMike Bayer    it's not known if there are deeper issues
28658e692d7SMike Bayer    however.   [ticket:822]
28758e692d7SMike Bayer
2882fca3c8eSMike Bayer  - [bug] repaired the with_hint() feature which
2892fca3c8eSMike Bayer    wasn't implemented correctly on MSSQL - 
2902fca3c8eSMike Bayer    usually used for the "WITH (NOLOCK)" hint
2912fca3c8eSMike Bayer    (which you shouldn't be using anyway ! 
2922fca3c8eSMike Bayer    use snapshot isolation instead :) )
2932fca3c8eSMike Bayer    [ticket:2336]
2942fca3c8eSMike Bayer
2953867ea9dSMike Bayer  - [bug] use new pyodbc version detection for
2963867ea9dSMike Bayer    _need_decimal_fix option, [ticket:2318]
2973867ea9dSMike Bayer
2980e256c28SMike Bayer  - [bug] don't cast "table name" as NVARCHAR
2990e256c28SMike Bayer    on SQL Server 2000.  Still mostly in the dark
3000e256c28SMike Bayer    what incantations are needed to make PyODBC
3010e256c28SMike Bayer    work fully with FreeTDS 0.91 here, however.
3020e256c28SMike Bayer    [ticket:2343]
3030e256c28SMike Bayer
3048ad65d0eSMike Bayer  - [bug] Decode incoming values when retrieving
3058ad65d0eSMike Bayer    list of index names and the names of columns
3068ad65d0eSMike Bayer    within those indexes.  [ticket:2269]
3078ad65d0eSMike Bayer
308b746921eSMike Bayer- mysql
309b746921eSMike Bayer  - [bug] Unicode adjustments allow latest pymysql 
310b746921eSMike Bayer    (post 0.4) to pass 100% on Python 2.
311e6a5ea8fSMike Bayer
31254a72583SMike Bayer- ext
31354a72583SMike Bayer   - [feature] Added an example to the hybrid docs
31454a72583SMike Bayer     of a "transformer" - a hybrid that returns a
31554a72583SMike Bayer     query-transforming callable in combination
31654a72583SMike Bayer     with a custom comparator.   Uses a new method
31754a72583SMike Bayer     on Query called with_transformation().  The use
31854a72583SMike Bayer     case here is fairly experimental, but only
31954a72583SMike Bayer     adds one line of code to Query.
32054a72583SMike Bayer
3215c9d53fbSMike Bayer   - [bug] the @compiles decorator raises an
3225c9d53fbSMike Bayer     informative error message when no "default"
3235c9d53fbSMike Bayer     compilation handler is present, rather
3245c9d53fbSMike Bayer     than KeyError.
3255c9d53fbSMike Bayer
326e7b612a6SMike Bayer- examples
327e7b612a6SMike Bayer   - [bug] Fixed bug in history_meta.py example where
328e7b612a6SMike Bayer     the "unique" flag was not removed from a 
329e7b612a6SMike Bayer     single-table-inheritance subclass which 
330e7b612a6SMike Bayer     generates columns to put up onto the base.
331e7b612a6SMike Bayer
332195a26e2SMike Bayer0.7.3
333195a26e2SMike Bayer=====
3342aa80d40SMike Bayer- general
3352aa80d40SMike Bayer   - Adjusted the "importlater" mechanism, which is
3362aa80d40SMike Bayer     used internally to resolve import cycles,
3372aa80d40SMike Bayer     such that the usage of __import__ is completed
3382aa80d40SMike Bayer     when the import of sqlalchemy or sqlalchemy.orm
3392aa80d40SMike Bayer     is done, thereby avoiding any usage of __import__
3402aa80d40SMike Bayer     after the application starts new threads,
3412aa80d40SMike Bayer     fixes [ticket:2279].  Also in 0.6.9.
3422aa80d40SMike Bayer
343195a26e2SMike Bayer- orm
344df02cc08SMike Bayer   - Improved query.join() such that the "left" side
345df02cc08SMike Bayer     can more flexibly be a non-ORM selectable, 
346df02cc08SMike Bayer     such as a subquery.   A selectable placed
347df02cc08SMike Bayer     in select_from() will now be used as the left
348df02cc08SMike Bayer     side, favored over implicit usage
349df02cc08SMike Bayer     of a mapped entity.
350df02cc08SMike Bayer     If the join still fails based on lack of
351df02cc08SMike Bayer     foreign keys, the error message includes 
352df02cc08SMike Bayer     this detail.  Thanks to brianrhude
353df02cc08SMike Bayer     on IRC for the test case.  [ticket:2298]
354df02cc08SMike Bayer
355195a26e2SMike Bayer   - Added after_soft_rollback() Session event.  This
356195a26e2SMike Bayer     event fires unconditionally whenever rollback()
357195a26e2SMike Bayer     is called, regardless of if an actual DBAPI
358195a26e2SMike Bayer     level rollback occurred.  This event
359195a26e2SMike Bayer     is specifically designed to allow operations
360195a26e2SMike Bayer     with the Session to proceed after a rollback
361195a26e2SMike Bayer     when the Session.is_active is True.
362195a26e2SMike Bayer     [ticket:2241]
36300a2f0efSMike Bayer 
36400a2f0efSMike Bayer  - added "adapt_on_names" boolean flag to orm.aliased()
36500a2f0efSMike Bayer    construct.  Allows an aliased() construct
36600a2f0efSMike Bayer    to link the ORM entity to a selectable that contains
36700a2f0efSMike Bayer    aggregates or other derived forms of a particular
36800a2f0efSMike Bayer    attribute, provided the name is the same as that
36900a2f0efSMike Bayer    of the entity mapped column.
370195a26e2SMike Bayer
371f07ffb47SMike Bayer  - Added new flag expire_on_flush=False to column_property(),
372f07ffb47SMike Bayer    marks those properties that would otherwise be considered
373f07ffb47SMike Bayer    to be "readonly", i.e. derived from SQL expressions,
374f07ffb47SMike Bayer    to retain their value after a flush has occurred, including
375f07ffb47SMike Bayer    if the parent object itself was involved in an update.
376f07ffb47SMike Bayer
3774f1321c3SMike Bayer  - Enhanced the instrumentation in the ORM to support
3784f1321c3SMike Bayer    Py3K's new argument style of "required kw arguments",
3794f1321c3SMike Bayer    i.e. fn(a, b, *, c, d), fn(a, b, *args, c, d).
3804f1321c3SMike Bayer    Argument signatures of mapped object's __init__
3814f1321c3SMike Bayer    method will be preserved, including required kw rules.
3824f1321c3SMike Bayer    [ticket:2237]
3834f1321c3SMike Bayer
384127c4825SMike Bayer  - Fixed bug in unit of work whereby detection of 
385127c4825SMike Bayer    "cycles" among classes in highly interlinked patterns
386127c4825SMike Bayer    would not produce a deterministic
387127c4825SMike Bayer    result; thereby sometimes missing some nodes that
388127c4825SMike Bayer    should be considered cycles and causing further
389127c4825SMike Bayer    issues down the road.  Note this bug is in 0.6 
390127c4825SMike Bayer    also; not backported at the moment.
391127c4825SMike Bayer    [ticket:2282]
392127c4825SMike Bayer
3939fae11e3SMike Bayer  - Fixed a variety of synonym()-related regressions
3949fae11e3SMike Bayer    from 0.6:
3959fae11e3SMike Bayer        - making a synonym against a synonym now works.
3969fae11e3SMike Bayer        - synonyms made against a relationship() can
3979fae11e3SMike Bayer          be passed to query.join(), options sent
3989fae11e3SMike Bayer          to query.options(), passed by name
3999fae11e3SMike Bayer          to query.with_parent().
40040ffa5a8SMike Bayer
40198a79154SMike Bayer  - Fixed bug whereby mapper.order_by attribute would
40298a79154SMike Bayer    be ignored in the "inner" query within a 
40398a79154SMike Bayer    subquery eager load.  [ticket:2287].
40498a79154SMike Bayer    Also in 0.6.9.
40598a79154SMike Bayer
406d2bd1395SMike Bayer  - Identity map .discard() uses dict.pop(,None) 
407d2bd1395SMike Bayer    internally instead of "del" to avoid KeyError/warning 
408d2bd1395SMike Bayer    during a non-determinate gc teardown [ticket:2267]
409d2bd1395SMike Bayer
410b412615bSMike Bayer  - Fixed regression in new composite rewrite where
411b412615bSMike Bayer    deferred=True option failed due to missing
412b412615bSMike Bayer    import [ticket:2253]
413b412615bSMike Bayer
41480c68c0eSMike Bayer  - Reinstated "comparator_factory" argument to 
415d1cc7e75SMike Bayer    composite(), removed when 0.7 was released.
41680c68c0eSMike Bayer    [ticket:2248]
41780c68c0eSMike Bayer
418b9a4eacfSMike Bayer  - Fixed bug in query.join() which would occur
419b9a4eacfSMike Bayer    in a complex multiple-overlapping path scenario,
420b9a4eacfSMike Bayer    where the same table could be joined to
421b9a4eacfSMike Bayer    twice.  Thanks *much* to Dave Vitek 
422b9a4eacfSMike Bayer    for the excellent fix here.  [ticket:2247]
423b9a4eacfSMike Bayer
4245751eb17SMike Bayer  - Query will convert an OFFSET of zero when
4255751eb17SMike Bayer    slicing into None, so that needless OFFSET
4265751eb17SMike Bayer    clauses are not invoked.
4275751eb17SMike Bayer
428e548b7f8SMike Bayer  - Repaired edge case where mapper would fail
429e548b7f8SMike Bayer    to fully update internal state when a relationship
430e548b7f8SMike Bayer    on a new mapper would establish a backref on the
431e548b7f8SMike Bayer    first mapper.
432e548b7f8SMike Bayer
4331492cc63SMike Bayer  - Fixed bug whereby if __eq__() was
4341492cc63SMike Bayer    redefined, a relationship many-to-one lazyload
4351492cc63SMike Bayer    would hit the __eq__() and fail.  [ticket:2260]
4361492cc63SMike Bayer    Does not apply to 0.6.9.
4371492cc63SMike Bayer
438bb978f2eSMike Bayer  - Calling class_mapper() and passing in an object
439bb978f2eSMike Bayer    that is not a "type" (i.e. a class that could 
440bb978f2eSMike Bayer    potentially be mapped) now raises an informative
441bb978f2eSMike Bayer    ArgumentError, rather than UnmappedClassError.
442bb978f2eSMike Bayer    [ticket:2196]
443bb978f2eSMike Bayer
444d1cc7e75SMike Bayer  - New event hook, MapperEvents.after_configured().
445bb62d802SMike Bayer    Called after a configure() step has completed and
446bb62d802SMike Bayer    mappers were in fact affected.   Theoretically this
447bb62d802SMike Bayer    event is called once per application, unless new mappings
448bb62d802SMike Bayer    are constructed after existing ones have been used
449bb62d802SMike Bayer    already.
450bb62d802SMike Bayer
451212583b0SMike Bayer  - When an open Session is garbage collected, the objects
452212583b0SMike Bayer    within it which remain are considered detached again
453212583b0SMike Bayer    when they are add()-ed to a new Session.
454212583b0SMike Bayer    This is accomplished by an extra check that the previous
455212583b0SMike Bayer    "session_key" doesn't actually exist among the pool
456212583b0SMike Bayer    of Sessions.  [ticket:2281]
457212583b0SMike Bayer
458bb62d802SMike Bayer  - New declarative features:
459bb62d802SMike Bayer        - __declare_last__() method, establishes an event
460bb62d802SMike Bayer        listener for the class method that will be called
461bb62d802SMike Bayer        when mappers are completed with the final "configure"
462bb62d802SMike Bayer        step.
463bb62d802SMike Bayer        - __abstract__ flag.   The class will not be mapped
464bb62d802SMike Bayer        at all when this flag is present on the class.
465bb62d802SMike Bayer        - New helper classes ConcreteBase, AbstractConcreteBase.
466bb62d802SMike Bayer        Allow concrete mappings using declarative which automatically
467bb62d802SMike Bayer        set up the "polymorphic_union" when the "configure"
468bb62d802SMike Bayer        mapper step is invoked.
469bb62d802SMike Bayer        - The mapper itself has semi-private methods that allow
470bb62d802SMike Bayer        the "with_polymorphic" selectable to be assigned
471bb62d802SMike Bayer        to the mapper after it has already been configured.
472bb62d802SMike Bayer        [ticket:2239]
473bb62d802SMike Bayer
47453cb6080SMike Bayer   - Declarative will warn when a subclass' base uses 
47553cb6080SMike Bayer     @declared_attr for a regular column - this attribute
47653cb6080SMike Bayer     does not propagate to subclasses. [ticket:2283]
47753cb6080SMike Bayer
478f11d14caSMike Bayer   - The integer "id" used to link a mapped instance with
479f11d14caSMike Bayer     its owning Session is now generated by a sequence
480f11d14caSMike Bayer     generation function rather than id(Session), to
481f11d14caSMike Bayer     eliminate the possibility of recycled id() values 
482f11d14caSMike Bayer     causing an incorrect result, no need to check that 
483f11d14caSMike Bayer     object actually in the session.  [ticket:2280]
484f11d14caSMike Bayer
4858c0e8223SMike Bayer-sql
486840aab3bSMike Bayer  - Behavioral improvement: empty
487840aab3bSMike Bayer    conjunctions such as and_() and or_() will be
488840aab3bSMike Bayer    flattened in the context of an enclosing conjunction,
489840aab3bSMike Bayer    i.e. and_(x, or_()) will produce 'X' and not 'X AND
490840aab3bSMike Bayer    ()'. [ticket:2257].
491840aab3bSMike Bayer
4928c0e8223SMike Bayer  - Fixed bug regarding calculation of "from" list 
4938c0e8223SMike Bayer    for a select() element.  The "from" calc is now
4948c0e8223SMike Bayer    delayed, so that if the construct uses a Column
4958c0e8223SMike Bayer    object that is not yet attached to a Table,
4968c0e8223SMike Bayer    but is later associated with a Table, it generates
4978c0e8223SMike Bayer    SQL using the table as a FROM.   This change
4988c0e8223SMike Bayer    impacted fairly deeply the mechanics of how 
4998c0e8223SMike Bayer    the FROM list as well as the "correlates" collection
5008c0e8223SMike Bayer    is calculated, as some "clause adaption" schemes
5018c0e8223SMike Bayer    (these are used very heavily in the ORM)
5028c0e8223SMike Bayer    were relying upon the fact that the "froms" 
5038c0e8223SMike Bayer    collection would typically be cached before the 
5048c0e8223SMike Bayer    adaption completed.   The rework allows it
5058c0e8223SMike Bayer    such that the "froms" collection can be cleared
5068c0e8223SMike Bayer    and re-generated at any time.  [ticket:2261]
5078c0e8223SMike Bayer
5089d775a4cSMike Bayer  - Fixed bug whereby with_only_columns() method of
5099d775a4cSMike Bayer    Select would fail if a selectable were passed.
5109d775a4cSMike Bayer    [ticket:2270].  Also in 0.6.9.
5119d775a4cSMike Bayer
51276a9219aSMike Bayer- schema
513e4c04590SMike Bayer  - Modified Column.copy() to use _constructor(), 
514e4c04590SMike Bayer    which defaults to self.__class__, in order to 
515e4c04590SMike Bayer    create the new object.  This allows easier support
516e4c04590SMike Bayer    of subclassing Column.  [ticket:2284]
517e4c04590SMike Bayer
51876a9219aSMike Bayer  - Added a slightly nicer __repr__() to SchemaItem
51976a9219aSMike Bayer    classes.  Note the repr here can't fully support
52076a9219aSMike Bayer    the "repr is the constructor" idea since schema
52176a9219aSMike Bayer    items can be very deeply nested/cyclical, have
52276a9219aSMike Bayer    late initialization of some things, etc.
52376a9219aSMike Bayer    [ticket:2223]
52476a9219aSMike Bayer
5259a2edbf3SMike Bayer- engine
5269a2edbf3SMike Bayer  - The recreate() method in all pool classes uses
5279a2edbf3SMike Bayer    self.__class__ to get at the type of pool
5289a2edbf3SMike Bayer    to produce, in the case of subclassing.  Note 
5299a2edbf3SMike Bayer    there's no usual need to subclass pools.
5309a2edbf3SMike Bayer    [ticket:2254]
5319a2edbf3SMike Bayer
532d3c1f245SMike Bayer  - Improvement to multi-param statement logging,
533d3c1f245SMike Bayer    long lists of bound parameter sets will be 
534d3c1f245SMike Bayer    compressed with an informative indicator
535d3c1f245SMike Bayer    of the compression taking place.  Exception
536d1cc7e75SMike Bayer    messages use the same improved formatting.
537d3c1f245SMike Bayer    [ticket:2243]
538d3c1f245SMike Bayer
53976006091SMike Bayer  - Added optional "sa_pool_key" argument to 
54076006091SMike Bayer    pool.manage(dbapi).connect() so that serialization
54176006091SMike Bayer    of args is not necessary.
54276006091SMike Bayer
543e80b725aSMike Bayer  - The entry point resolution supported by 
544e80b725aSMike Bayer    create_engine() now supports resolution of
545e80b725aSMike Bayer    individual DBAPI drivers on top of a built-in
546e80b725aSMike Bayer    or entry point-resolved dialect, using the 
547e80b725aSMike Bayer    standard '+' notation - it's converted to
548e80b725aSMike Bayer    a '.' before being resolved as an entry
549e80b725aSMike Bayer    point.  [ticket:2286]
550e80b725aSMike Bayer
551f1eea634SMike Bayer  - Added an exception catch + warning for the
552f1eea634SMike Bayer    "return unicode detection" step within connect,
553f1eea634SMike Bayer    allows databases that crash on NVARCHAR to
554f1eea634SMike Bayer    continue initializing, assuming no NVARCHAR
555f1eea634SMike Bayer    type implemented.  [ticket:2299]
556f1eea634SMike Bayer
557f7426427SMike Bayer- types
558f7426427SMike Bayer  - Extra keyword arguments to the base Float 
559f7426427SMike Bayer    type beyond "precision" and "asdecimal" are ignored;
560f7426427SMike Bayer    added a deprecation warning here and additional
561f7426427SMike Bayer    docs, related to [ticket:2258]
562f7426427SMike Bayer
563757400f8SMike Bayer- sqlite
564757400f8SMike Bayer  - Ensured that the same ValueError is raised for
565757400f8SMike Bayer    illegal date/time/datetime string parsed from
566757400f8SMike Bayer    the database regardless of whether C 
567757400f8SMike Bayer    extensions are in use or not.
568757400f8SMike Bayer
569c13dee04SMike Bayer- postgresql
570bf2f3595SMike Bayer  - Added "postgresql_using" argument to Index(), produces
571bf2f3595SMike Bayer    USING clause to specify index implementation for
572bf2f3595SMike Bayer    PG.  [ticket:2290].  Thanks to Ryan P. Kelly for
573bf2f3595SMike Bayer    the patch.
574bf2f3595SMike Bayer
5755397d953SMike Bayer  - Added client_encoding parameter to create_engine()
5765397d953SMike Bayer    when the postgresql+psycopg2 dialect is used;
5775397d953SMike Bayer    calls the psycopg2 set_client_encoding() method
5785397d953SMike Bayer    with the value upon connect.  [ticket:1839]
5795397d953SMike Bayer
580879c9320SMike Bayer  - Fixed bug related to [ticket:2141] whereby the 
581879c9320SMike Bayer    same modified index behavior in PG 9 affected
582879c9320SMike Bayer    primary key reflection on a renamed column.
583879c9320SMike Bayer    [ticket:2291].  Also in 0.6.9.
584879c9320SMike Bayer
58584384774SMike Bayer  - Reflection functions for Table, Sequence no longer
58684384774SMike Bayer    case insensitive.  Names can be differ only in case
58784384774SMike Bayer    and will be correctly distinguished.  [ticket:2256]
58884384774SMike Bayer
589c13dee04SMike Bayer  - Use an atomic counter as the "random number" 
590c13dee04SMike Bayer    source for server side cursor names; 
591c13dee04SMike Bayer    conflicts have been reported in rare cases.
592c13dee04SMike Bayer
5938b505e7cSMike Bayer  - Narrowed the assumption made when reflecting
5948b505e7cSMike Bayer    a foreign-key referenced table with schema in
5958b505e7cSMike Bayer    the current search path; an explicit schema will
5968b505e7cSMike Bayer    be applied to the referenced table only if 
5978b505e7cSMike Bayer    it actually matches that of the referencing table,
5988b505e7cSMike Bayer    which also has an explicit schema.   Previously
5998b505e7cSMike Bayer    it was assumed that "current" schema was synonymous
6008b505e7cSMike Bayer    with the full search_path.  [ticket:2249]
6018b505e7cSMike Bayer
602a9ebba3eSMike Bayer- mysql
603a9ebba3eSMike Bayer  - a CREATE TABLE will put the COLLATE option 
604a9ebba3eSMike Bayer    after CHARSET, which appears to be part of 
605a9ebba3eSMike Bayer    MySQL's arbitrary rules regarding if it will actually
606539c7a1cSMike Bayer    work or not.  [ticket:2225]  Also in 0.6.9.
607a9ebba3eSMike Bayer
608a0cc36c2SMike Bayer  - Added mysql_length parameter to Index construct,
609a0cc36c2SMike Bayer    specifies "length" for indexes.  [ticket:2293]
610a0cc36c2SMike Bayer
6115751eb17SMike Bayer- mssql
61257ae8672SMike Bayer  - Changes to attempt support of FreeTDS 0.91 with 
61357ae8672SMike Bayer    Pyodbc.  This includes that string binds are sent as 
61457ae8672SMike Bayer    Python unicode objects when FreeTDS 0.91 is detected,
61557ae8672SMike Bayer    and a CAST(? AS NVARCHAR) is used when we detect 
61657ae8672SMike Bayer    for a table.   However, I'd continue
61757ae8672SMike Bayer    to characterize Pyodbc + FreeTDS 0.91 behavior as 
61857ae8672SMike Bayer    pretty crappy, there are still many queries such 
61957ae8672SMike Bayer    as used in reflection which cause a core dump on 
62057ae8672SMike Bayer    Linux, and it is not really usable at all
62157ae8672SMike Bayer    on OSX, MemoryErrors abound and just plain broken 
62257ae8672SMike Bayer    unicode support.   [ticket:2273]
62357ae8672SMike Bayer
624c52e31b1SMike Bayer  - The behavior of =/!= when comparing a scalar select
625c52e31b1SMike Bayer    to a value will no longer produce IN/NOT IN as of 0.8;
626c52e31b1SMike Bayer    this behavior is a little too heavy handed (use in_() if
627d1cc7e75SMike Bayer    you want to emit IN) and now emits a deprecation warning.
628c52e31b1SMike Bayer    To get the 0.8 behavior immediately and remove the warning, 
629c52e31b1SMike Bayer    a compiler recipe is given at 
630c52e31b1SMike Bayer    http://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons
631c52e31b1SMike Bayer    to override the behavior of visit_binary().
632c52e31b1SMike Bayer    [ticket:2277]
633c52e31b1SMike Bayer
6345751eb17SMike Bayer  - "0" is accepted as an argument for limit() which
6355751eb17SMike Bayer    will produce "TOP 0". [ticket:2222]
6365751eb17SMike Bayer
637cefa4e9aSMike Bayer- oracle
638cefa4e9aSMike Bayer  - Fixed ReturningResultProxy for zxjdbc dialect.
6391144f1acSMike Bayer    [ticket:2272].  Regression from 0.6.
640cefa4e9aSMike Bayer
6413f347eddSMike Bayer  - The String type now generates VARCHAR2 on Oracle
6423f347eddSMike Bayer    which is recommended as the default VARCHAR.
6433f347eddSMike Bayer    Added an explicit VARCHAR2 and NVARCHAR2 to the Oracle
6443f347eddSMike Bayer    dialect as well.   Using NVARCHAR still generates
6453f347eddSMike Bayer    "NVARCHAR2" - there is no "NVARCHAR" on Oracle -
6463f347eddSMike Bayer    this remains a slight breakage of the "uppercase types
6473f347eddSMike Bayer    always give exactly that" policy.  VARCHAR still 
6483f347eddSMike Bayer    generates "VARCHAR", keeping with the policy.   If
6493f347eddSMike Bayer    Oracle were to ever define "VARCHAR" as something 
6503f347eddSMike Bayer    different as they claim (IMHO this will never happen), 
6513f347eddSMike Bayer    the type would be available.  [ticket:2252]
6523f347eddSMike Bayer
653669d0c47SMike Bayer- ext
654d2792309SMike Bayer  - SQLSoup will not be included in version 0.8
655d2792309SMike Bayer    of SQLAlchemy; while useful, we would like to
656d2792309SMike Bayer    keep SQLAlchemy itself focused on one ORM
657d2792309SMike Bayer    usage paradigm.  SQLSoup will hopefully
658d2792309SMike Bayer    soon be superseded by a third party 
659d2792309SMike Bayer    project.  [ticket:2262]
660d2792309SMike Bayer
661669d0c47SMike Bayer  - Added local_attr, remote_attr, attr accessors
662669d0c47SMike Bayer    to AssociationProxy, providing quick access
663669d0c47SMike Bayer    to the proxied attributes at the class
664669d0c47SMike Bayer    level. [ticket:2236]
665669d0c47SMike Bayer
6661cf80dc5SMike Bayer  - Changed the update() method on association proxy
6671cf80dc5SMike Bayer    dictionary to use a duck typing approach, i.e.
6681cf80dc5SMike Bayer    checks for "keys", to discern between update({}) 
6691cf80dc5SMike Bayer    and update((a, b)).   Previously, passing a 
6701cf80dc5SMike Bayer    dictionary that had tuples as keys would be misinterpreted
6711cf80dc5SMike Bayer    as a sequence. [ticket:2275]
6721cf80dc5SMike Bayer
6731e6a2096SMike Bayer- examples
6741e6a2096SMike Bayer  - Adjusted dictlike-polymorphic.py example
6751e6a2096SMike Bayer    to apply the CAST such that it works on 
6761e6a2096SMike Bayer    PG, other databases.  [ticket:2266]
6771e6a2096SMike Bayer    Also in 0.6.9.
6781e6a2096SMike Bayer
6799a34d9a8SMike Bayer0.7.2
6809a34d9a8SMike Bayer=====
681ac9a007cSMike Bayer- orm
68215cd4235SMike Bayer  - Feature enhancement: joined and subquery
68315cd4235SMike Bayer    loading will now traverse already-present related
68415cd4235SMike Bayer    objects and collections in search of unpopulated
68515cd4235SMike Bayer    attributes throughout the scope of the eager load
68615cd4235SMike Bayer    being defined, so that the eager loading that is
68715cd4235SMike Bayer    specified via mappings or query options
68815cd4235SMike Bayer    unconditionally takes place for the full depth,
68915cd4235SMike Bayer    populating whatever is not already populated.
69015cd4235SMike Bayer    Previously, this traversal would stop if a related
69115cd4235SMike Bayer    object or collection were already present leading
69215cd4235SMike Bayer    to inconsistent behavior (though would save on
69315cd4235SMike Bayer    loads/cycles for an already-loaded graph). For a
69415cd4235SMike Bayer    subqueryload, this means that the additional
69515cd4235SMike Bayer    SELECT statements emitted by subqueryload will
69615cd4235SMike Bayer    invoke unconditionally, no matter how much of the
69715cd4235SMike Bayer    existing graph is already present (hence the
69815cd4235SMike Bayer    controversy). The previous behavior of "stopping"
69915cd4235SMike Bayer    is still in effect when a query is the result of
70015cd4235SMike Bayer    an attribute-initiated lazyload, as otherwise an
70115cd4235SMike Bayer    "N+1" style of collection iteration can become
70215cd4235SMike Bayer    needlessly expensive when the same related object
70315cd4235SMike Bayer    is encountered repeatedly. There's also an 
70415cd4235SMike Bayer    as-yet-not-public generative Query method 
70515cd4235SMike Bayer    _with_invoke_all_eagers()
70615cd4235SMike Bayer    which selects old/new behavior [ticket:2213]
70715cd4235SMike Bayer
7088a483dbfSMike Bayer  - A rework of "replacement traversal" within
7098a483dbfSMike Bayer    the ORM as it alters selectables to be against
7108a483dbfSMike Bayer    aliases of things (i.e. clause adaption) includes 
7118a483dbfSMike Bayer    a fix for multiply-nested any()/has() constructs 
7128a483dbfSMike Bayer    against a joined table structure.  [ticket:2195]
7138a483dbfSMike Bayer
714de0e2724SMike Bayer  - Fixed bug where query.join() + aliased=True
715de0e2724SMike Bayer    from a joined-inh structure to itself on 
716de0e2724SMike Bayer    relationship() with join condition on the child
717de0e2724SMike Bayer    table would convert the lead entity into the 
718de0e2724SMike Bayer    joined one inappropriately.  [ticket:2234]
719de0e2724SMike Bayer    Also in 0.6.9.
720de0e2724SMike Bayer
7210cc357c6SMike Bayer  - Fixed regression from 0.6 where Session.add()
7220cc357c6SMike Bayer    against an object which contained None in a
7230cc357c6SMike Bayer    collection would raise an internal exception.
7240cc357c6SMike Bayer    Reverted this to 0.6's behavior which is to 
7250cc357c6SMike Bayer    accept the None but obviously nothing is
7260cc357c6SMike Bayer    persisted.  Ideally, collections with None 
7270cc357c6SMike Bayer    present or on append() should at least emit a 
7280cc357c6SMike Bayer    warning, which is being considered for 0.8.
7290cc357c6SMike Bayer    [ticket:2205]
7300cc357c6SMike Bayer
7311a0c8aceSMike Bayer  - Load of a deferred() attribute on an object
7321a0c8aceSMike Bayer    where row can't be located raises 
7331a0c8aceSMike Bayer    ObjectDeletedError instead of failing later
7341a0c8aceSMike Bayer    on; improved the message in ObjectDeletedError
7351a0c8aceSMike Bayer    to include other conditions besides a simple
7361a0c8aceSMike Bayer    "delete". [ticket:2191]
7371a0c8aceSMike Bayer
738f288c065SMike Bayer  - Fixed regression from 0.6 where a get history
739f288c065SMike Bayer    operation on some relationship() based attributes
740f288c065SMike Bayer    would fail when a lazyload would emit; this could 
741f288c065SMike Bayer    trigger within a flush() under certain conditions.
742f288c065SMike Bayer    [ticket:2224]  Thanks to the user who submitted
743f288c065SMike Bayer    the great test for this.
744f288c065SMike Bayer
7455abc4112SMike Bayer  - Fixed bug apparent only in Python 3 whereby
7465abc4112SMike Bayer    sorting of persistent + pending objects during
7475abc4112SMike Bayer    flush would produce an illegal comparison,
7485abc4112SMike Bayer    if the persistent object primary key 
7495abc4112SMike Bayer    is not a single integer.  [ticket:2228]
7505abc4112SMike Bayer    Also in 0.6.9
7515abc4112SMike Bayer
752cdf727aeSMike Bayer  - Fixed bug whereby the source clause
753cdf727aeSMike Bayer    used by query.join() would be inconsistent
754cdf727aeSMike Bayer    if against a column expression that combined
755cdf727aeSMike Bayer    multiple entities together.  [ticket:2197]
756cdf727aeSMike Bayer    Also in 0.6.9
757cdf727aeSMike Bayer
758660e82ecSMike Bayer  - Fixed bug whereby if a mapped class
759660e82ecSMike Bayer    redefined __hash__() or __eq__() to something
760660e82ecSMike Bayer    non-standard, which is a supported use case
761660e82ecSMike Bayer    as SQLA should never consult these,
762660e82ecSMike Bayer    the methods would be consulted if the class
763660e82ecSMike Bayer    was part of a "composite" (i.e. non-single-entity)
764660e82ecSMike Bayer    result set.  [ticket:2215]
765660e82ecSMike Bayer    Also in 0.6.9.
766660e82ecSMike Bayer
767a45da117SMike Bayer  - Added public attribute ".validators" to 
768a45da117SMike Bayer    Mapper, an immutable dictionary view of 
769a45da117SMike Bayer    all attributes that have been decorated
770a45da117SMike Bayer    with the @validates decorator.
771a45da117SMike Bayer    [ticket:2240] courtesy Stefano Fontanelli
772a45da117SMike Bayer
773668991a7SMike Bayer  - Fixed subtle bug that caused SQL to blow
774668991a7SMike Bayer    up if: column_property() against subquery +
775668991a7SMike Bayer    joinedload + LIMIT + order by the column
776668991a7SMike Bayer    property() occurred.  [ticket:2188].
777668991a7SMike Bayer    Also in 0.6.9
778668991a7SMike Bayer
7795b8738b7SMike Bayer  - The join condition produced by with_parent
7805b8738b7SMike Bayer    as well as when using a "dynamic" relationship
7815b8738b7SMike Bayer    against a parent will generate unique
7825b8738b7SMike Bayer    bindparams, rather than incorrectly repeating 
7835b8738b7SMike Bayer    the same bindparam.  [ticket:2207].
7845b8738b7SMike Bayer    Also in 0.6.9.
7855b8738b7SMike Bayer
786ac9a007cSMike Bayer  - Added the same "columns-only" check to 
7875b8738b7SMike Bayer    mapper.polymorphic_on as used when
788d1cc7e75SMike Bayer    receiving user arguments to
789ac9a007cSMike Bayer    relationship.order_by, foreign_keys,
790ac9a007cSMike Bayer    remote_side, etc.
791ac9a007cSMike Bayer
792eaa7aa42SMike Bayer  - Fixed bug whereby comparison of column
793eaa7aa42SMike Bayer    expression to a Query() would not call
794eaa7aa42SMike Bayer    as_scalar() on the underlying SELECT 
795eaa7aa42SMike Bayer    statement to produce a scalar subquery,
796eaa7aa42SMike Bayer    in the way that occurs if you called
797eaa7aa42SMike Bayer    it on Query().subquery(). [ticket:2190]
798eaa7aa42SMike Bayer
79923a14f29SMike Bayer  - Fixed declarative bug where a class inheriting
80023a14f29SMike Bayer    from a superclass of the same name would fail
80123a14f29SMike Bayer    due to an unnecessary lookup of the name
80223a14f29SMike Bayer    in the _decl_class_registry. [ticket:2194]
80323a14f29SMike Bayer
804cf7453e0SMike Bayer  - Repaired the "no statement condition" 
805cf7453e0SMike Bayer    assertion in Query which would attempt
806cf7453e0SMike Bayer    to raise if a generative method were called
807cf7453e0SMike Bayer    after from_statement() were called.
808cf7453e0SMike Bayer    [ticket:2199].  Also in 0.6.9.
809cf7453e0SMike Bayer
81063dbed1fSMike Bayer- sql
811668991a7SMike Bayer  - Fixed two subtle bugs involving column 
812668991a7SMike Bayer    correspondence in a selectable,
813668991a7SMike Bayer    one with the same labeled subquery repeated, the other
814668991a7SMike Bayer    when the label has been "grouped" and 
815668991a7SMike Bayer    loses itself.  Affects [ticket:2188].
81663dbed1fSMike Bayer
817fc4f7de0SMike Bayer- schema
81853cbbaa8SMike Bayer  - New feature: with_variant() method on 
81953cbbaa8SMike Bayer    all types.  Produces an instance of Variant(),
82053cbbaa8SMike Bayer    a special TypeDecorator which will select
82153cbbaa8SMike Bayer    the usage of a different type based on the
82253cbbaa8SMike Bayer    dialect in use. [ticket:2187]
82353cbbaa8SMike Bayer
824c1295ce5SMike Bayer  - Added an informative error message when 
825c1295ce5SMike Bayer    ForeignKeyConstraint refers to a column name in 
826c1295ce5SMike Bayer    the parent that is not found.  Also in 0.6.9.
827c1295ce5SMike Bayer
828fc4f7de0SMike Bayer  - Fixed bug whereby adaptation of old append_ddl_listener()
829fc4f7de0SMike Bayer    function was passing unexpected **kw through 
830fc4f7de0SMike Bayer    to the Table event.   Table gets no kws, the MetaData
831fc4f7de0SMike Bayer    event in 0.6 would get "tables=somecollection",
832fc4f7de0SMike Bayer    this behavior is preserved.  [ticket:2206]
833fc4f7de0SMike Bayer
8349ae8de1fSMike Bayer  - Fixed bug where "autoincrement" detection on 
8359ae8de1fSMike Bayer    Table would fail if the type had no "affinity"
8369ae8de1fSMike Bayer    value, in particular this would occur when using 
8379ae8de1fSMike Bayer    the UUID example on the site that uses TypeEngine
8389ae8de1fSMike Bayer    as the "impl".
8399ae8de1fSMike Bayer
8403daae3e5SMike Bayer  - Added an improved repr() to TypeEngine objects
8413daae3e5SMike Bayer    that will only display constructor args which
8423daae3e5SMike Bayer    are positional or kwargs that deviate
8433daae3e5SMike Bayer    from the default.  [ticket:2209]
8443daae3e5SMike Bayer
8457173d11bSMike Bayer- engine
8467bb2adffSMike Bayer  - Context manager provided by Connection.begin()
8477bb2adffSMike Bayer    will issue rollback() if the commit() fails,
8487bb2adffSMike Bayer    not just if an exception occurs.
8497bb2adffSMike Bayer
8507173d11bSMike Bayer  - Use urllib.parse_qsl() in Python 2.6 and above,
8517173d11bSMike Bayer    no deprecation warning about cgi.parse_qsl()
8527173d11bSMike Bayer    [ticket:1682]
8537173d11bSMike Bayer
854e821573aSMike Bayer  - Added mixin class sqlalchemy.ext.DontWrapMixin.
855e821573aSMike Bayer    User-defined exceptions of this type are never
856e821573aSMike Bayer    wrapped in StatementException when they 
857e821573aSMike Bayer    occur in the context of a statement 
858e821573aSMike Bayer    execution.
859e821573aSMike Bayer
860e936a7b3SMike Bayer  - StatementException wrapping will display the
861d1cc7e75SMike Bayer    original exception class in the message.
862e936a7b3SMike Bayer
863e936a7b3SMike Bayer  - Failures on connect which raise dbapi.Error
864e936a7b3SMike Bayer    will forward the error to dialect.is_disconnect()
865e936a7b3SMike Bayer    and set the "connection_invalidated" flag if 
866e936a7b3SMike Bayer    the dialect knows this to be a potentially
867e936a7b3SMike Bayer    "retryable" condition.  Only Oracle ORA-01033
868e936a7b3SMike Bayer    implemented for now.  [ticket:2201]
869e821573aSMike Bayer
870086ae956SMike Bayer- sqlite
871086ae956SMike Bayer  - SQLite dialect no longer strips quotes
872086ae956SMike Bayer    off of reflected default value, allowing
873d1cc7e75SMike Bayer    a round trip CREATE TABLE to work.
874086ae956SMike Bayer    This is consistent with other dialects
875086ae956SMike Bayer    that also maintain the exact form of
876086ae956SMike Bayer    the default.  [ticket:2189]
877086ae956SMike Bayer
878b2d50f28SMike Bayer- postgresql
879b2d50f28SMike Bayer  - Added new "postgresql_ops" argument to 
880b2d50f28SMike Bayer    Index, allows specification of PostgreSQL
881b2d50f28SMike Bayer    operator classes for indexed columns.
882b2d50f28SMike Bayer    [ticket:2198]  Courtesy Filip Zyzniewski.
883b2d50f28SMike Bayer
884e1f9f963SMike Bayer- mysql
885e1f9f963SMike Bayer  - Fixed OurSQL dialect to use ansi-neutral 
886e1f9f963SMike Bayer    quote symbol "'" for XA commands instead
887e1f9f963SMike Bayer    of '"'.  [ticket:2186].  Also in 0.6.9.
888e1f9f963SMike Bayer
8899a34d9a8SMike Bayer- mssql
8909a34d9a8SMike Bayer  - Adjusted the pyodbc dialect such that bound
8919a34d9a8SMike Bayer    values are passed as bytes and not unicode
8929a34d9a8SMike Bayer    if the "Easysoft" unix drivers are detected. 
8939a34d9a8SMike Bayer    This is the same behavior as occurs with
8949a34d9a8SMike Bayer    FreeTDS.  Easysoft appears to segfault
8959a34d9a8SMike Bayer    if Python unicodes are passed under
8969a34d9a8SMike Bayer    certain circumstances.
8979a34d9a8SMike Bayer
8986040af5dSMike Bayer- oracle
8996040af5dSMike Bayer  - Added ORA-00028 to disconnect codes, use 
9006040af5dSMike Bayer    cx_oracle _Error.code to get at the code,
9016040af5dSMike Bayer    [ticket:2200].  Also in 0.6.9.
9026040af5dSMike Bayer
903e936a7b3SMike Bayer  - Added ORA-01033 to disconnect codes, which
904e936a7b3SMike Bayer    can be caught during a connection 
905e936a7b3SMike Bayer    event.  [ticket:2201]
906e936a7b3SMike Bayer
907bd45f22eSMike Bayer  - repaired the oracle.RAW type which did not
908bd45f22eSMike Bayer    generate the correct DDL.  [ticket:2220]
909bd45f22eSMike Bayer    Also in 0.6.9.
910bd45f22eSMike Bayer
91105cbb6b2SMike Bayer  - added CURRENT to reserved word list.
91205cbb6b2SMike Bayer    [ticket:2212] Also in 0.6.9.
91305cbb6b2SMike Bayer
914287e9d6aSMike Bayer-ext
915287e9d6aSMike Bayer  - Fixed bug in the mutable extension whereby
916287e9d6aSMike Bayer    if the same type were used twice in one
917287e9d6aSMike Bayer    mapping, the attributes beyond the first
918287e9d6aSMike Bayer    would not get instrumented.
919287e9d6aSMike Bayer
920409a95adSMike Bayer  - Fixed bug in the mutable extension whereby
921409a95adSMike Bayer    if None or a non-corresponding type were set, 
922409a95adSMike Bayer    an error would be raised.  None is now accepted
923409a95adSMike Bayer    which assigns None to all attributes,
924409a95adSMike Bayer    illegal values raise ValueError.
925409a95adSMike Bayer
926e30d02c6SMike Bayer- examples
927e30d02c6SMike Bayer  - Repaired the examples/versioning test runner
928e30d02c6SMike Bayer    to not rely upon SQLAlchemy test libs,
929e30d02c6SMike Bayer    nosetests must be run from within
930e30d02c6SMike Bayer    examples/versioning to get around setup.cfg
931e30d02c6SMike Bayer    breaking it.
932e30d02c6SMike Bayer
933e30d02c6SMike Bayer  - Tweak to examples/versioning to pick the
934e30d02c6SMike Bayer    correct foreign key in a multi-level
935e30d02c6SMike Bayer    inheritance situation.
936e30d02c6SMike Bayer
937e4d9679cSMike Bayer  - Fixed the attribute shard example to check
938e4d9679cSMike Bayer    for bind param callable correctly in 0.7 
939e4d9679cSMike Bayer    style.
940e4d9679cSMike Bayer
941736481e5SMike Bayer0.7.1
942736481e5SMike Bayer=====
943dc75e0c6SMike Bayer- general
944dc75e0c6SMike Bayer  - Added a workaround for Python bug 7511 where
945dc75e0c6SMike Bayer    failure of C extension build does not 
946dc75e0c6SMike Bayer    raise an appropriate exception on Windows 64
947dc75e0c6SMike Bayer    bit + VC express [ticket:2184]
948dc75e0c6SMike Bayer
949c25412d9SMike Bayer- orm
950c25412d9SMike Bayer  - "delete-orphan" cascade is now allowed on
951c25412d9SMike Bayer    self-referential relationships - this since
952c25412d9SMike Bayer    SQLA 0.7 no longer enforces "parent with no 
953c25412d9SMike Bayer    child" at the ORM level; this check is left
954e30d02c6SMike Bayer    up to foreign key nullability.
955c25412d9SMike Bayer    Related to [ticket:1912]
956736481e5SMike Bayer
9575cac2468SMike Bayer  - Repaired new "mutable" extension to propagate
9585cac2468SMike Bayer    events to subclasses correctly; don't 
9595cac2468SMike Bayer    create multiple event listeners for 
9605cac2468SMike Bayer    subclasses either.  [ticket:2180]
9615cac2468SMike Bayer
962d9a2c64aSMike Bayer  - Modify the text of the message which occurs
963d9a2c64aSMike Bayer    when the "identity" key isn't detected on 
964d9a2c64aSMike Bayer    flush, to include the common cause that
965d9a2c64aSMike Bayer    the Column isn't set up to detect
966d9a2c64aSMike Bayer    auto-increment correctly; [ticket:2170].
967d9a2c64aSMike Bayer    Also in 0.6.8.
968d9a2c64aSMike Bayer
96908f493dcSMike Bayer  - Fixed bug where transaction-level "deleted"
97008f493dcSMike Bayer    collection wouldn't be cleared of expunged
97108f493dcSMike Bayer    states, raising an error if they later
97208f493dcSMike Bayer    became transient [ticket:2182]. 
97308f493dcSMike Bayer    Also in 0.6.8.
97408f493dcSMike Bayer
975736481e5SMike Bayer- sql
976fae54b27SMike Bayer  - Fixed bug whereby metadata.reflect(bind)
977fae54b27SMike Bayer    would close a Connection passed as a
978fae54b27SMike Bayer    bind argument.  Regression from 0.6.
979fae54b27SMike Bayer
980736481e5SMike Bayer  - Streamlined the process by which a Select
981736481e5SMike Bayer    determines what's in it's '.c' collection.
982736481e5SMike Bayer    Behaves identically, except that a 
983736481e5SMike Bayer    raw ClauseList() passed to select([]) 
984736481e5SMike Bayer    (which is not a documented case anyway) will
985736481e5SMike Bayer    now be expanded into its individual column
986736481e5SMike Bayer    elements instead of being ignored.
987736481e5SMike Bayer
988df21626eSMike Bayer- engine
989df21626eSMike Bayer  - Deprecate schema/SQL-oriented methods on 
990df21626eSMike Bayer    Connection/Engine that were never well known
991df21626eSMike Bayer    and are redundant:  reflecttable(), create(), 
992df21626eSMike Bayer    drop(), text(), engine.func
993df21626eSMike Bayer
99409080baaSMike Bayer  - Adjusted the __contains__() method of 
99509080baaSMike Bayer    a RowProxy result row such that no exception
996e30d02c6SMike Bayer    throw is generated internally;
99709080baaSMike Bayer    NoSuchColumnError() also will generate its 
99809080baaSMike Bayer    message regardless of whether or not the column 
999e30d02c6SMike Bayer    construct can be coerced to a string.
100009080baaSMike Bayer    [ticket:2178].  Also in 0.6.8.
100109080baaSMike Bayer
10028c09969dSMike Bayer- sqlite
10038c09969dSMike Bayer  - Accept None from cursor.fetchone() when
10048c09969dSMike Bayer    "PRAGMA read_uncommitted" is called to determine
10058c09969dSMike Bayer    current isolation mode at connect time and
10068c09969dSMike Bayer    default to SERIALIZABLE; this to support SQLite 
10078c09969dSMike Bayer    versions pre-3.3.0 that did not have this 
10088c09969dSMike Bayer    feature.  [ticket:2173]
10098c09969dSMike Bayer
1010c0f92211SMike Bayer- postgresql
1011c0f92211SMike Bayer  - Some unit test fixes regarding numeric arrays, 
1012c0f92211SMike Bayer    MATCH operator.   A potential floating-point
1013c0f92211SMike Bayer    inaccuracy issue was fixed, and certain tests 
1014c0f92211SMike Bayer    of the MATCH operator only execute within an 
1015e30d02c6SMike Bayer    EN-oriented locale for now.  [ticket:2175].
1016c0f92211SMike Bayer    Also in 0.6.8.
1017c0f92211SMike Bayer
10189211ecb6SMike Bayer- mysql
10199211ecb6SMike Bayer  - Unit tests pass 100% on MySQL installed
10209211ecb6SMike Bayer    on windows.
10219211ecb6SMike Bayer
10229211ecb6SMike Bayer  - Removed the "adjust casing" step that would
10239211ecb6SMike Bayer    fail when reflecting a table on MySQL
10249211ecb6SMike Bayer    on windows with a mixed case name.  After some
10259211ecb6SMike Bayer    experimenting with a windows MySQL server, it's
10269211ecb6SMike Bayer    been determined that this step wasn't really 
10279211ecb6SMike Bayer    helping the situation much; MySQL does not return
10289211ecb6SMike Bayer    FK names with proper casing on non-windows 
10299211ecb6SMike Bayer    platforms either, and removing the step at
10309211ecb6SMike Bayer    least allows the reflection to act more like
10319211ecb6SMike Bayer    it does on other OSes.   A warning here
10329211ecb6SMike Bayer    has been considered but its difficult to 
10339211ecb6SMike Bayer    determine under what conditions such a warning
10349211ecb6SMike Bayer    can be raised, so punted on that for now - 
10359211ecb6SMike Bayer    added some docs instead. [ticket:2181]
10369211ecb6SMike Bayer
10379211ecb6SMike Bayer  - supports_sane_rowcount will be set to False
10389211ecb6SMike Bayer    if using MySQLdb and the DBAPI doesn't provide 
10399211ecb6SMike Bayer    the constants.CLIENT module.
10409211ecb6SMike Bayer
10412e5e325aSMike Bayer0.7.0
1042b02193bdSMike Bayer=======
10432e5e325aSMike Bayer- This section documents those changes from 0.7b4
10442e5e325aSMike Bayer  to 0.7.0.  For an overview of what's new in 
10452e5e325aSMike Bayer  SQLAlchemy 0.7, see 
10462e5e325aSMike Bayer  http://www.sqlalchemy.org/trac/wiki/07Migration
10472e5e325aSMike Bayer
1048b02193bdSMike Bayer- orm
1049b02193bdSMike Bayer  - Fixed regression introduced in 0.7b4 (!) whereby
1050b02193bdSMike Bayer    query.options(someoption("nonexistent name")) would
1051b02193bdSMike Bayer    fail to raise an error.  Also added additional
1052b02193bdSMike Bayer    error catching for cases where the option would
1053b02193bdSMike Bayer    try to build off a column-based element, further
1054b02193bdSMike Bayer    fixed up some of the error messages tailored
1055b02193bdSMike Bayer    in [ticket:2069]
1056b02193bdSMike Bayer
105794ee7170SMike Bayer  - query.count() emits "count(*)" instead of 
105894ee7170SMike Bayer    "count(1)".  [ticket:2162]
105994ee7170SMike Bayer
1060ebb80339SMike Bayer  - Fine tuning of Query clause adaptation when
1061ebb80339SMike Bayer    from_self(), union(), or other "select from
1062ebb80339SMike Bayer    myself" operation, such that plain SQL expression
1063ebb80339SMike Bayer    elements added to filter(), order_by() etc.
1064ebb80339SMike Bayer    which are present in the nested "from myself" 
1065ebb80339SMike Bayer    query *will* be adapted in the same way an ORM
1066ebb80339SMike Bayer    expression element will, since these
1067ebb80339SMike Bayer    elements are otherwise not easily accessible.
1068ebb80339SMike Bayer    [ticket:2155]
1069ebb80339SMike Bayer
10704292c562SMike Bayer  - Fixed bug where determination of "self referential"
10714292c562SMike Bayer    relationship would fail with no workaround
10724292c562SMike Bayer    for joined-inh subclass related to itself,
10734292c562SMike Bayer    or joined-inh subclass related to a subclass
10744292c562SMike Bayer    of that with no cols in the sub-sub class 
10754292c562SMike Bayer    in the join condition.  [ticket:2149]
10764292c562SMike Bayer    Also in 0.6.8.
10774292c562SMike Bayer
10787adcb1c7SMike Bayer  - mapper() will ignore non-configured foreign keys
10797adcb1c7SMike Bayer    to unrelated tables when determining inherit
10804bc2402cSMike Bayer    condition between parent and child class,
10814bc2402cSMike Bayer    but will raise as usual for unresolved
10824bc2402cSMike Bayer    columns and table names regarding the inherited
10834bc2402cSMike Bayer    table.  This is an enhanced generalization of 
10844bc2402cSMike Bayer    behavior that was already applied to declarative
10854bc2402cSMike Bayer    previously.  [ticket:2153]   0.6.8 has a more
10864bc2402cSMike Bayer    conservative version of this which doesn't
10874bc2402cSMike Bayer    fundamentally alter how join conditions
10884bc2402cSMike Bayer    are determined.
10897adcb1c7SMike Bayer
1090eb569b67SMike Bayer  - It is an error to call query.get() when the
1091eb569b67SMike Bayer    given entity is not a single, full class 
1092eb569b67SMike Bayer    entity or mapper (i.e. a column).  This is
1093e30d02c6SMike Bayer    a deprecation warning in 0.6.8.
1094eb569b67SMike Bayer    [ticket:2144]
1095eb569b67SMike Bayer
109681a025fcSMike Bayer  - Fixed a potential KeyError which under some
109781a025fcSMike Bayer    circumstances could occur with the identity 
109881a025fcSMike Bayer    map, part of [ticket:2148]
109981a025fcSMike Bayer
110002fa8bacSMike Bayer  - added Query.with_session() method, switches 
110102fa8bacSMike Bayer    Query to use a different session.
110202fa8bacSMike Bayer
1103815e4ef4SMike Bayer  - horizontal shard query should use execution
1104815e4ef4SMike Bayer    options per connection as per [ticket:2131]
1105815e4ef4SMike Bayer
11067df21e5aSMike Bayer  - a non_primary mapper will inherit the _identity_class
11077df21e5aSMike Bayer    of the primary mapper.  This so that a non_primary
11087df21e5aSMike Bayer    established against a class that's normally in an
11097df21e5aSMike Bayer    inheritance mapping will produce results that are 
11107df21e5aSMike Bayer    identity-map compatible with that of the primary
11117df21e5aSMike Bayer    mapper [ticket:2151] (also in 0.6.8)
11127df21e5aSMike Bayer
1113de9c030fSMike Bayer  - Fixed the error message emitted for "can't
1114de9c030fSMike Bayer    execute syncrule for destination column 'q';
1115de9c030fSMike Bayer    mapper 'X' does not map this column" to 
1116de9c030fSMike Bayer    reference the correct mapper.  [ticket:2163].
1117de9c030fSMike Bayer    Also in 0.6.8.
1118de9c030fSMike Bayer
11199826ba73SMike Bayer  - polymorphic_union() gets a "cast_nulls" option,
11209826ba73SMike Bayer    disables the usage of CAST when it renders
11219826ba73SMike Bayer    the labeled NULL columns.  [ticket:1502]
11229826ba73SMike Bayer
11239826ba73SMike Bayer  - polymorphic_union() renders the columns in their
11249826ba73SMike Bayer    original table order, as according to the first
11259826ba73SMike Bayer    table/selectable in the list of polymorphic
11269826ba73SMike Bayer    unions in which they appear.  (which is itself 
11279826ba73SMike Bayer    an unordered mapping unless you pass an OrderedDict).
11289826ba73SMike Bayer
1129a1a588faSMike Bayer  - Fixed bug whereby mapper mapped to an anonymous
1130a1a588faSMike Bayer    alias would fail if logging were used, due to 
1131a1a588faSMike Bayer    unescaped % sign in the alias name.  [ticket:2171]
1132a1a588faSMike Bayer    Also in 0.6.8.
1133a1a588faSMike Bayer
11340c560edeSMike Bayer- sql
113500380cf3SMike Bayer  - Fixed bug whereby nesting a label of a select()
113600380cf3SMike Bayer    with another label in it would produce incorrect
113700380cf3SMike Bayer    exported columns.   Among other things this would
113800380cf3SMike Bayer    break an ORM column_property() mapping against
113900380cf3SMike Bayer    another column_property().  [ticket:2167].
114000380cf3SMike Bayer    Also in 0.6.8
114100380cf3SMike Bayer
11424bc2402cSMike Bayer  - Changed the handling in determination of join
11434bc2402cSMike Bayer    conditions such that foreign key errors are
11444bc2402cSMike Bayer    only considered between the two given tables.
11454bc2402cSMike Bayer    That is, t1.join(t2) will report FK errors
11464bc2402cSMike Bayer    that involve 't1' or 't2', but anything 
11474bc2402cSMike Bayer    involving 't3' will be skipped.   This affects
11484bc2402cSMike Bayer    join(), as well as ORM relationship and
11494bc2402cSMike Bayer    inherit condition logic.
11504bc2402cSMike Bayer
11517b2a76c4SMike Bayer  - Some improvements to error handling inside
11527b2a76c4SMike Bayer    of the execute procedure to ensure auto-close
11537b2a76c4SMike Bayer    connections are really closed when very 
11547b2a76c4SMike Bayer    unusual DBAPI errors occur.
11557b2a76c4SMike Bayer
1156d2162980SMike Bayer  - metadata.reflect() and reflection.Inspector() 
1157d2162980SMike Bayer    had some reliance on GC to close connections
1158d2162980SMike Bayer    which were internally procured, fixed this.
1159d2162980SMike Bayer
11600c560edeSMike Bayer  - Added explicit check for when Column .name
11610c560edeSMike Bayer    is assigned as blank string [ticket:2140]
11620c560edeSMike Bayer
11633452a2baSMike Bayer  - Fixed bug whereby if FetchedValue was passed
11643452a2baSMike Bayer    to column server_onupdate, it would not
11653452a2baSMike Bayer    have its parent "column" assigned, added
11663452a2baSMike Bayer    test coverage for all column default assignment
11673452a2baSMike Bayer    patterns.  [ticket:2147]  also in 0.6.8
11683452a2baSMike Bayer
1169c718dea7SMike Bayer- postgresql
1170c718dea7SMike Bayer  - Fixed the psycopg2_version parsing in the 
1171c718dea7SMike Bayer    psycopg2 dialect.
1172c718dea7SMike Bayer
1173ef654af3SMike Bayer  - Fixed bug affecting PG 9 whereby index reflection
1174ef654af3SMike Bayer    would fail if against a column whose name
1175ef654af3SMike Bayer    had changed.  [ticket:2141].  Also in 0.6.8.
1176ef654af3SMike Bayer
1177c7713a6fSMike Bayer- mssql
1178c7713a6fSMike Bayer  - Fixed bug in MSSQL dialect whereby the aliasing
1179c7713a6fSMike Bayer    applied to a schema-qualified table would leak
1180c7713a6fSMike Bayer    into enclosing select statements [ticket:2169].
1181c7713a6fSMike Bayer    Also in 0.6.8.
1182c7713a6fSMike Bayer
1183425b7388SMike Bayer- documentation
1184425b7388SMike Bayer  - Removed the usage of the "collections.MutableMapping"
1185425b7388SMike Bayer    abc from the ext.mutable docs as it was being used
1186425b7388SMike Bayer    incorrectly and makes the example more difficult
1187425b7388SMike Bayer    to understand in any case.  [ticket:2152]
1188425b7388SMike Bayer
1189d0322642SMike Bayer- examples
1190d0322642SMike Bayer  - removed the ancient "polymorphic association"
1191d0322642SMike Bayer    examples and replaced with an updated set of
1192d0322642SMike Bayer    examples that use declarative mixins, 
1193d0322642SMike Bayer    "generic_associations".   Each presents an alternative
1194d0322642SMike Bayer    table layout.
1195d0322642SMike Bayer
1196501b8aecSMike Bayer- ext
1197501b8aecSMike Bayer  - Fixed bugs in sqlalchemy.ext.mutable extension where
1198501b8aecSMike Bayer    `None` was not appropriately handled, replacement
1199501b8aecSMike Bayer    events were not appropriately handled.
1200501b8aecSMike Bayer    [ticket:2143]
1201501b8aecSMike Bayer
120239c465ecSMike Bayer0.7.0b4
120339c465ecSMike Bayer=======
1204cddf5856SMike Bayer- general
1205cddf5856SMike Bayer  - Changes to the format of CHANGES, this file.
1206cddf5856SMike Bayer    The format changes have been applied to 
1207cddf5856SMike Bayer    the 0.7 releases.
1208cddf5856SMike Bayer
1209cddf5856SMike Bayer    - The "-declarative" changes will now be listed
1210cddf5856SMike Bayer      directly under the "-orm" section, as these
1211cddf5856SMike Bayer      are closely related.
1212cddf5856SMike Bayer
1213cddf5856SMike Bayer    - The 0.5 series changes have been moved to
1214cddf5856SMike Bayer      the file CHANGES_PRE_06 which replaces
1215cddf5856SMike Bayer      CHANGES_PRE_05.
1216cddf5856SMike Bayer
1217cddf5856SMike Bayer    - The changelog for 0.6.7 and subsequent within
1218cddf5856SMike Bayer      the 0.6 series is now listed only in the 
1219e30d02c6SMike Bayer      CHANGES file within the 0.6 branch.
1220cddf5856SMike Bayer      In the 0.7 CHANGES file (i.e. this file), all the
1221cddf5856SMike Bayer      0.6 changes are listed inline within the 0.7
1222cddf5856SMike Bayer      section in which they were also applied 
1223cddf5856SMike Bayer      (since all 0.6 changes are in 0.7 as well).
1224cddf5856SMike Bayer      Changes that apply to an 0.6 version here
1225cddf5856SMike Bayer      are noted as are if any differences in 
1226cddf5856SMike Bayer      implementation/behavior are present.
1227cddf5856SMike Bayer
122833691f68SMike Bayer- orm
1229708a25e7SMike Bayer  - Some fixes to "evaulate" and "fetch" evaluation
1230708a25e7SMike Bayer    when query.update(), query.delete() are called.
1231708a25e7SMike Bayer    The retrieval of records is done after autoflush
1232708a25e7SMike Bayer    in all cases, and before update/delete is 
1233708a25e7SMike Bayer    emitted, guarding against unflushed data present
1234708a25e7SMike Bayer    as well as expired objects failing during 
1235708a25e7SMike Bayer    the evaluation.  [ticket:2122]
1236708a25e7SMike Bayer
123733691f68SMike Bayer  - Reworded the exception raised when a flush
123833691f68SMike Bayer    is attempted of a subclass that is not polymorphic
123933691f68SMike Bayer    against the supertype.  [ticket:2063]
124033691f68SMike Bayer
1241ed578377SMike Bayer  - Still more wording adjustments when a query option
1242ed578377SMike Bayer    can't find the target entity.  Explain that the
1243ed578377SMike Bayer    path must be from one of the root entities.
1244ed578377SMike Bayer
1245a6450322SMike Bayer  - Some fixes to the state handling regarding 
1246a6450322SMike Bayer    backrefs, typically when autoflush=False, where
1247a6450322SMike Bayer    the back-referenced collection wouldn't 
1248a6450322SMike Bayer    properly handle add/removes with no net 
1249a6450322SMike Bayer    change.  Thanks to Richard Murri for the 
1250a6450322SMike Bayer    test case + patch.  [ticket:2123]
1251a6450322SMike Bayer    (also in 0.6.7).
1252a6450322SMike Bayer
12531da499a8SMike Bayer  - Added checks inside the UOW to detect the unusual
12541da499a8SMike Bayer    condition of being asked to UPDATE or DELETE
12551da499a8SMike Bayer    on a primary key value that contains NULL
12561da499a8SMike Bayer    in it.  [ticket:2127]
12571da499a8SMike Bayer
12581da499a8SMike Bayer  - Some refinements to attribute history.  More
12591da499a8SMike Bayer    changes are pending possibly in 0.8, but
12601da499a8SMike Bayer    for now history has been modified such that
12611da499a8SMike Bayer    scalar history doesn't have a "side effect"
12621da499a8SMike Bayer    of populating None for a non-present value.
12631da499a8SMike Bayer    This allows a slightly better ability to 
12641da499a8SMike Bayer    distinguish between a None set and no actual 
12651da499a8SMike Bayer    change, affects [ticket:2127] as well.
12661da499a8SMike Bayer
1267674d4f8dSMike Bayer  - a "having" clause would be copied from the
1268674d4f8dSMike Bayer    inside to the outside query if from_self()
1269674d4f8dSMike Bayer    were used; in particular this would break
1270674d4f8dSMike Bayer    an 0.7 style count() query [ticket:2130].
1271674d4f8dSMike Bayer    (also in 0.6.7)
1272674d4f8dSMike Bayer
1273566f4688SMike Bayer  - the Query.execution_options() method now passes
1274566f4688SMike Bayer    those options to the Connection rather than
1275566f4688SMike Bayer    the SELECT statement, so that all available
1276566f4688SMike Bayer    options including isolation level and 
1277566f4688SMike Bayer    compiled cache may be used.  [ticket:2131]
1278566f4688SMike Bayer
127939c465ecSMike Bayer- sql
1280566f4688SMike Bayer  - The "compiled_cache" execution option now raises
1281566f4688SMike Bayer    an error when passed to a SELECT statement 
1282566f4688SMike Bayer    rather than a Connection.  Previously it was
1283566f4688SMike Bayer    being ignored entirely.   We may look into
1284566f4688SMike Bayer    having this option work on a per-statement
1285566f4688SMike Bayer    level at some point. [ticket:2131]
1286566f4688SMike Bayer
128739c465ecSMike Bayer  - Restored the "catchall" constructor on the base
128839c465ecSMike Bayer    TypeEngine class, with a deprecation warning.
128939c465ecSMike Bayer    This so that code which does something like
129039c465ecSMike Bayer    Integer(11) still succeeds.
129139c465ecSMike Bayer
129293da3087SMike Bayer  - Fixed regression whereby MetaData() coming
129393da3087SMike Bayer    back from unpickling did not keep track of 
129493da3087SMike Bayer    new things it keeps track of now, i.e.
129593da3087SMike Bayer    collection of Sequence objects, list
129693da3087SMike Bayer    of schema names.  [ticket:2104]
129793da3087SMike Bayer
129851fea2e1SMike Bayer  - The limit/offset keywords to select() as well
129951fea2e1SMike Bayer    as the value passed to select.limit()/offset()
130051fea2e1SMike Bayer    will be coerced to integer.  [ticket:2116]
130151fea2e1SMike Bayer    (also in 0.6.7)
130251fea2e1SMike Bayer
13032d34ded2SMike Bayer  - fixed bug where "from" clause gathering from an
13042d34ded2SMike Bayer    over() clause would be an itertools.chain() and
13052d34ded2SMike Bayer    not a list, causing "can only concatenate list"
13062d34ded2SMike Bayer    TypeError when combined with other clauses.
13072d34ded2SMike Bayer
1308509f3fb4SMike Bayer  - Fixed incorrect usage of "," in over() clause
1309509f3fb4SMike Bayer    being placed between the "partition" and "order by"
1310509f3fb4SMike Bayer    clauses.  [ticket:2134]
1311509f3fb4SMike Bayer
1312ae363b06SMike Bayer  - Before/after attach events for PrimaryKeyConstraint
1313ae363b06SMike Bayer    now function, tests added for before/after events
1314ae363b06SMike Bayer    on all constraint types.  [ticket:2105]
1315ae363b06SMike Bayer
131669dcd805SMike Bayer  - Added explicit true()/false() constructs to expression
131769dcd805SMike Bayer    lib - coercion rules will intercept "False"/"True"
131869dcd805SMike Bayer    into these constructs.  In 0.6, the constructs were
131969dcd805SMike Bayer    typically converted straight to string, which was 
132069dcd805SMike Bayer    no longer accepted in 0.7.  [ticket:2117]
132169dcd805SMike Bayer
1322a2094b1bSPhilip Jenvey- engine
1323e6fd32e1SPhilip Jenvey  - The C extension is now enabled by default on CPython
1324e6fd32e1SPhilip Jenvey    2.x with a fallback to pure python if it fails to
1325e6fd32e1SPhilip Jenvey    compile.  [ticket:2129]
1326a2094b1bSPhilip Jenvey
1327d34bc7daSMike Bayer- schema
1328d34bc7daSMike Bayer  - The 'useexisting' flag on Table has been superceded
1329d34bc7daSMike Bayer    by a new pair of flags 'keep_existing' and 
1330d34bc7daSMike Bayer    'extend_existing'.   'extend_existing' is equivalent
1331d34bc7daSMike Bayer    to 'useexisting' - the existing Table is returned,
1332d34bc7daSMike Bayer    and additional constructor elements are added.
1333d34bc7daSMike Bayer    With 'keep_existing', the existing Table is returned,
1334d34bc7daSMike Bayer    but additional constructor elements are not added -
1335d34bc7daSMike Bayer    these elements are only applied when the Table
1336d34bc7daSMike Bayer    is newly created.   [ticket:2109]
1337d34bc7daSMike Bayer
1338b462373bSMike Bayer- types
1339b462373bSMike Bayer  - REAL has been added to the core types.  Supported
1340b462373bSMike Bayer    by Postgresql, SQL Server, MySQL, SQLite.  Note
1341b462373bSMike Bayer    that the SQL Server and MySQL versions, which 
1342b462373bSMike Bayer    add extra arguments, are also still available
1343b462373bSMike Bayer    from those dialects.  [ticket:2081]
1344b462373bSMike Bayer
13450b52a5aeSMike Bayer-event
13460b52a5aeSMike Bayer  - Added @event.listens_for() decorator, given
13470b52a5aeSMike Bayer    target + event name, applies the decorated 
13480b52a5aeSMike Bayer    function as a listener.  [ticket:2106]
13490b52a5aeSMike Bayer
1350218c3cb3SMike Bayer- pool
1351218c3cb3SMike Bayer  - AssertionPool now stores the traceback indicating
1352218c3cb3SMike Bayer    where the currently checked out connection was
1353218c3cb3SMike Bayer    acquired; this traceback is reported within
1354218c3cb3SMike Bayer    the assertion raised upon a second concurrent 
1355218c3cb3SMike Bayer    checkout; courtesy Gunnlaugur Briem 
1356218c3cb3SMike Bayer    [ticket:2103]
1357218c3cb3SMike Bayer
1358393730f3SMike Bayer  - The "pool.manage" feature doesn't use pickle
1359393730f3SMike Bayer    anymore to hash the arguments for each pool.
1360393730f3SMike Bayer
1361fb97a666SMike Bayer- sqlite
1362fb97a666SMike Bayer  - Fixed bug where reflection of foreign key
1363fb97a666SMike Bayer    created as "REFERENCES <tablename>" without
1364fb97a666SMike Bayer    col name would fail.  [ticket:2115]
1365fb97a666SMike Bayer    (also in 0.6.7)
1366fb97a666SMike Bayer
13675eee7e2eSMike Bayer- postgresql
13685eee7e2eSMike Bayer  - Psycopg2 for Python 3 is now supported.
13695eee7e2eSMike Bayer
1370f9113b5dSMike Bayer  - Fixed support for precision numerics when using
1371f9113b5dSMike Bayer    pg8000. [ticket:2132]
1372f9113b5dSMike Bayer
1373545b70e8SMike Bayer- oracle
1374545b70e8SMike Bayer  - Using column names that would require quotes
1375545b70e8SMike Bayer    for the column itself or for a name-generated
1376545b70e8SMike Bayer    bind parameter, such as names with special
1377545b70e8SMike Bayer    characters, underscores, non-ascii characters,
1378545b70e8SMike Bayer    now properly translate bind parameter keys when
1379545b70e8SMike Bayer    talking to cx_oracle.  [ticket:2100]  (Also
1380545b70e8SMike Bayer    in 0.6.7)
1381545b70e8SMike Bayer
138251fea2e1SMike Bayer  - Oracle dialect adds use_binds_for_limits=False
138351fea2e1SMike Bayer    create_engine() flag, will render the LIMIT/OFFSET
138451fea2e1SMike Bayer    values inline instead of as binds, reported to
138551fea2e1SMike Bayer    modify the execution plan used by Oracle.
138651fea2e1SMike Bayer    [ticket:2116] (Also in 0.6.7)
138751fea2e1SMike Bayer
1388d355a3beSMike Bayer- documentation
1389d355a3beSMike Bayer  - Documented SQLite DATE/TIME/DATETIME types.
1390d355a3beSMike Bayer    [ticket:2029] (also in 0.6.7)
1391d355a3beSMike Bayer
139230143823SMike Bayer  - Fixed mutable extension docs to show the 
139330143823SMike Bayer    correct type-association methods.
139430143823SMike Bayer    [ticket:2118]
139530143823SMike Bayer
1396cf511311SMike Bayer0.7.0b3
1397cf511311SMike Bayer=======
1398b1b8e7deSMike Bayer- general
1399cddf5856SMike Bayer  - Lots of fixes to unit tests when run under Pypy
1400cddf5856SMike Bayer    (courtesy Alex Gaynor).
1401b1b8e7deSMike Bayer
1402403d7869SMike Bayer- orm
1403e7be5a57SMike Bayer  - Changed the underlying approach to query.count().
1404e7be5a57SMike Bayer    query.count() is now in all cases exactly:
1405e7be5a57SMike Bayer
1406e7be5a57SMike Bayer        query.
1407e7be5a57SMike Bayer            from_self(func.count(literal_column('1'))).
1408e7be5a57SMike Bayer            scalar()
1409e7be5a57SMike Bayer
1410e7be5a57SMike Bayer    That is, "select count(1) from (<full query>)".
1411e7be5a57SMike Bayer    This produces a subquery in all cases, but 
1412e7be5a57SMike Bayer    vastly simplifies all the guessing count()
1413e7be5a57SMike Bayer    tried to do previously, which would still
1414e7be5a57SMike Bayer    fail in many scenarios particularly when
1415e7be5a57SMike Bayer    joined table inheritance and other joins
1416e7be5a57SMike Bayer    were involved.  If the subquery produced
1417e7be5a57SMike Bayer    for an otherwise very simple count is really 
1418e7be5a57SMike Bayer    an issue, use query(func.count()) as an 
1419e7be5a57SMike Bayer    optimization.  [ticket:2093]
1420e7be5a57SMike Bayer
1421403d7869SMike Bayer  - some changes to the identity map regarding
1422403d7869SMike Bayer    rare weakref callbacks during iterations.
1423403d7869SMike Bayer    The mutex has been removed as it apparently 
1424403d7869SMike Bayer    can cause a reentrant (i.e. in one thread) deadlock,
1425403d7869SMike Bayer    perhaps when gc collects objects at the point of 
1426403d7869SMike Bayer    iteration in order to gain more memory.  It is hoped
1427403d7869SMike Bayer    that "dictionary changed during iteration" will
1428403d7869SMike Bayer    be exceedingly rare as iteration methods internally
1429403d7869SMike Bayer    acquire the full list of objects in a single values() 
1430cddf5856SMike Bayer    call. Note 0.6.7 has a more conservative fix here
1431cddf5856SMike Bayer    which still keeps the mutex in place. [ticket:2087]
1432403d7869SMike Bayer
1433438c31e6SMike Bayer  - A tweak to the unit of work causes it to order
1434438c31e6SMike Bayer    the flush along relationship() dependencies even if 
1435438c31e6SMike Bayer    the given objects don't have any inter-attribute 
1436438c31e6SMike Bayer    references in memory, which was the behavior in 
1437438c31e6SMike Bayer    0.5 and earlier, so a flush of Parent/Child with
1438e30d02c6SMike Bayer    only foreign key/primary key set will succeed.
1439438c31e6SMike Bayer    This while still maintaining 0.6 and above's not 
1440438c31e6SMike Bayer    generating a ton of useless internal dependency 
1441438c31e6SMike Bayer    structures within the flush that don't correspond 
1442438c31e6SMike Bayer    to state actually within the current flush.
1443438c31e6SMike Bayer    [ticket:2082]
1444438c31e6SMike Bayer
1445464835e4SMike Bayer  - Improvements to the error messages emitted when
1446464835e4SMike Bayer    querying against column-only entities in conjunction
1447464835e4SMike Bayer    with (typically incorrectly) using loader options, 
1448e30d02c6SMike Bayer    where the parent entity is not fully present.
1449464835e4SMike Bayer    [ticket:2069]
1450464835e4SMike Bayer
1451cec64cf8SMike Bayer  - Fixed bug in query.options() whereby a path 
1452cec64cf8SMike Bayer    applied to a lazyload using string keys could 
1453cec64cf8SMike Bayer    overlap a same named attribute on the wrong 
1454cddf5856SMike Bayer    entity.  Note 0.6.7 has a more conservative fix 
1455cec64cf8SMike Bayer    to this.  [ticket:2098]
1456cec64cf8SMike Bayer
1457cddf5856SMike Bayer- declarative
1458cddf5856SMike Bayer  - Arguments in __mapper_args__ that aren't "hashable"
1459cddf5856SMike Bayer    aren't mistaken for always-hashable, possibly-column
1460cddf5856SMike Bayer    arguments.  [ticket:2091] (also in 0.6.7)
1461cddf5856SMike Bayer
1462cf511311SMike Bayer- sql
1463cf511311SMike Bayer  - Added a fully descriptive error message for the
1464cf511311SMike Bayer    case where Column is subclassed and _make_proxy()
1465cf511311SMike Bayer    fails to make a copy due to TypeError on the
1466cf511311SMike Bayer    constructor.   The method _constructor should
1467cf511311SMike Bayer    be implemented in this case.
1468cf511311SMike Bayer
14692bd01b2dSMike Bayer  - Added new event "column_reflect" for Table objects.
14702bd01b2dSMike Bayer    Receives the info dictionary about a Column before
14712bd01b2dSMike Bayer    the object is generated within reflection, and allows
14722bd01b2dSMike Bayer    modification to the dictionary for control over
14732bd01b2dSMike Bayer    most aspects of the resulting Column including 
14742bd01b2dSMike Bayer    key, name, type, info dictionary.  [ticket:2095]
14752bd01b2dSMike Bayer
14762bd01b2dSMike Bayer  - To help with the "column_reflect" event being used
14772bd01b2dSMike Bayer    with specific Table objects instead of all instances
14782bd01b2dSMike Bayer    of Table, listeners can be added to a Table object 
14792bd01b2dSMike Bayer    inline with its construction using a new argument 
14802bd01b2dSMike Bayer    "listeners", a list of tuples of the form 
14812bd01b2dSMike Bayer    (<eventname>, <fn>), which are applied to the Table 
14822bd01b2dSMike Bayer    before the reflection process begins.
14832bd01b2dSMike Bayer
148490335a89SMike Bayer  - Added new generic function "next_value()", accepts
148590335a89SMike Bayer    a Sequence object as its argument and renders the
148690335a89SMike Bayer    appropriate "next value" generation string on the
148790335a89SMike Bayer    target platform, if supported.  Also provides
1488e30d02c6SMike Bayer    ".next_value()" method on Sequence itself.
148990335a89SMike Bayer    [ticket:2085]
149090335a89SMike Bayer
149190335a89SMike Bayer  - func.next_value() or other SQL expression can
149290335a89SMike Bayer    be embedded directly into an insert() construct,
149390335a89SMike Bayer    and if implicit or explicit "returning" is used
149490335a89SMike Bayer    in conjunction with a primary key column, 
149590335a89SMike Bayer    the newly generated value will be present in
149690335a89SMike Bayer    result.inserted_primary_key. [ticket:2084]
149790335a89SMike Bayer
1498cddf5856SMike Bayer  - Added accessors to ResultProxy "returns_rows", 
1499cddf5856SMike Bayer    "is_insert" [ticket:2089] (also in 0.6.7)
1500cddf5856SMike Bayer
1501852a1aefSMike Bayer- engine
1502852a1aefSMike Bayer  - Fixed AssertionPool regression bug.  [ticket:2097]
1503852a1aefSMike Bayer
150462c54510SMichael Trier  - Changed exception raised to ArgumentError when an
150562c54510SMichael Trier    invalid dialect is specified. [ticket:2060]
150662c54510SMichael Trier
1507cddf5856SMike Bayer- postgresql
1508cddf5856SMike Bayer  - Added RESERVED_WORDS for postgresql dialect. [ticket:2092]
1509cddf5856SMike Bayer    (also in 0.6.7)
1510cddf5856SMike Bayer
1511cddf5856SMike Bayer  - Fixed the BIT type to allow a "length" parameter, "varying"
1512cddf5856SMike Bayer    parameter.  Reflection also fixed.  [ticket:2073]
1513cddf5856SMike Bayer    (also in 0.6.7)
1514cddf5856SMike Bayer
1515cddf5856SMike Bayer- mssql
1516cddf5856SMike Bayer  - Rewrote the query used to get the definition of a view,
1517cddf5856SMike Bayer    typically when using the Inspector interface, to
1518cddf5856SMike Bayer    use sys.sql_modules instead of the information schema,
1519cddf5856SMike Bayer    thereby allowing views definitions longer than 4000
1520cddf5856SMike Bayer    characters to be fully returned.  [ticket:2071]
1521cddf5856SMike Bayer    (also in 0.6.7)
1522cddf5856SMike Bayer
1523cddf5856SMike Bayer- firebird
1524cddf5856SMike Bayer  - The "implicit_returning" flag on create_engine() is
1525cddf5856SMike Bayer    honored if set to False.  [ticket:2083] (also in 0.6.7)
1526cddf5856SMike Bayer
1527cddf5856SMike Bayer- informix
1528cddf5856SMike Bayer
1529cddf5856SMike Bayer  - Added RESERVED_WORDS informix dialect. [ticket:2092]
1530cddf5856SMike Bayer    (also in 0.6.7)
1531cddf5856SMike Bayer
1532cddf5856SMike Bayer- ext
1533cddf5856SMike Bayer  - The horizontal_shard ShardedSession class accepts the common
1534cddf5856SMike Bayer    Session argument "query_cls" as a constructor argument,
1535cddf5856SMike Bayer    to enable further subclassing of ShardedQuery.
1536cddf5856SMike Bayer    [ticket:2090] (also in 0.6.7)
1537cddf5856SMike Bayer
15388af45f93SMike Bayer- examples
15398af45f93SMike Bayer  - Updated the association, association proxy examples
15408af45f93SMike Bayer    to use declarative, added a new example 
15418af45f93SMike Bayer    dict_of_sets_with_default.py, a "pushing the envelope" 
15428af45f93SMike Bayer    example of association proxy.
15438af45f93SMike Bayer
1544cddf5856SMike Bayer  - The Beaker caching example allows a "query_cls" argument
1545cddf5856SMike Bayer    to the query_callable() function.  [ticket:2090] 
1546cddf5856SMike Bayer    (also in 0.6.7)
1547cddf5856SMike Bayer
1548838d78afSMike Bayer0.7.0b2
1549838d78afSMike Bayer========
1550838d78afSMike Bayer- orm
1551838d78afSMike Bayer  - Fixed bug whereby Session.merge() would call the
1552838d78afSMike Bayer    load() event with one too few arguments.
1553838d78afSMike Bayer    [ticket:2053]
1554838d78afSMike Bayer
1555838d78afSMike Bayer  - Added logic which prevents the generation of 
1556838d78afSMike Bayer    events from a MapperExtension or SessionExtension 
1557838d78afSMike Bayer    from generating do-nothing events for all the methods 
1558838d78afSMike Bayer    not overridden. [ticket:2052]
1559838d78afSMike Bayer
1560cddf5856SMike Bayer- declarative
1561cddf5856SMike Bayer  - Fixed regression whereby composite() with 
1562cddf5856SMike Bayer    Column objects placed inline would fail
1563cddf5856SMike Bayer    to initialize.  The Column objects can now
1564cddf5856SMike Bayer    be inline with the composite() or external
1565cddf5856SMike Bayer    and pulled in via name or object ref. 
1566cddf5856SMike Bayer    [ticket:2058]
1567cddf5856SMike Bayer
1568cddf5856SMike Bayer  - Fix error message referencing old @classproperty
1569cddf5856SMike Bayer    name to reference @declared_attr [ticket:2061]
1570cddf5856SMike Bayer    (also in 0.6.7)
1571cddf5856SMike Bayer
1572cddf5856SMike Bayer  - the dictionary at the end of the __table_args__
1573cddf5856SMike Bayer    tuple is now optional.  [ticket:1468]
1574cddf5856SMike Bayer
15752e4da522SMike Bayer- sql
15767b22358fSMike Bayer  - Renamed the EngineEvents event class to 
15777b22358fSMike Bayer    ConnectionEvents.  As these classes are never
15787b22358fSMike Bayer    accessed directly by end-user code, this strictly
15797b22358fSMike Bayer    is a documentation change for end users.  Also
15807b22358fSMike Bayer    simplified how events get linked to engines
15817b22358fSMike Bayer    and connections internally. [ticket:2059]
15827b22358fSMike Bayer
15832e4da522SMike Bayer  - The Sequence() construct, when passed a MetaData() 
15842e4da522SMike Bayer    object via its 'metadata' argument, will be 
15852e4da522SMike Bayer    included in CREATE/DROP statements within
15862e4da522SMike Bayer    metadata.create_all() and metadata.drop_all(), 
15872e4da522SMike Bayer    including "checkfirst" logic.  [ticket:2055]
15882e4da522SMike Bayer
158901cb9469SMike Bayer  - The Column.references() method now returns True
159001cb9469SMike Bayer    if it has a foreign key referencing the
159101cb9469SMike Bayer    given column exactly, not just it's parent
159201cb9469SMike Bayer    table.  [ticket:2064]
159301cb9469SMike Bayer
159474f26d22SMike Bayer- postgresql
159574f26d22SMike Bayer  - Fixed regression from 0.6 where SMALLINT and
159674f26d22SMike Bayer    BIGINT types would both generate SERIAL
159774f26d22SMike Bayer    on an integer PK column, instead of 
159874f26d22SMike Bayer    SMALLINT and BIGSERIAL [ticket:2065]
159974f26d22SMike Bayer
160027220358SMike Bayer- ext
160127220358SMike Bayer  - Association proxy now has correct behavior for
160227220358SMike Bayer    any(), has(), and contains() when proxying
160327220358SMike Bayer    a many-to-one scalar attribute to a one-to-many
160427220358SMike Bayer    collection (i.e. the reverse of the 'typical'
160527220358SMike Bayer    association proxy use case)  [ticket:2054]
160627220358SMike Bayer
160764580940SMike Bayer- examples
160864580940SMike Bayer  - Beaker example now takes into account 'limit'
160964580940SMike Bayer    and 'offset', bind params within embedded
161064580940SMike Bayer    FROM clauses (like when you use union() or 
161164580940SMike Bayer    from_self()) when generating a cache key.
161264580940SMike Bayer
161354085a0eSMike Bayer0.7.0b1
161454085a0eSMike Bayer=======
1615eee9b55fSMike Bayer- Detailed descriptions of each change below are 
1616eee9b55fSMike Bayer  described at:
1617eee9b55fSMike Bayer  http://www.sqlalchemy.org/trac/wiki/07Migration
1618eee9b55fSMike Bayer
1619eee9b55fSMike Bayer- general
1620eee9b55fSMike Bayer  - New event system, supercedes all extensions, listeners,
1621eee9b55fSMike Bayer    etc.  [ticket:1902]
1622eee9b55fSMike Bayer
1623eee9b55fSMike Bayer  - Logging enhancements
1624eee9b55fSMike Bayer    [ticket:1926]
1625eee9b55fSMike Bayer
1626eee9b55fSMike Bayer  - Setup no longer installs a Nose plugin
1627eee9b55fSMike Bayer    [ticket:1949]
1628eee9b55fSMike Bayer
162953aab63bSMike Bayer  - The "sqlalchemy.exceptions" alias in sys.modules
163053aab63bSMike Bayer    has been removed.   Base SQLA exceptions are 
163153aab63bSMike Bayer    available via "from sqlalchemy import exc".
163253aab63bSMike Bayer    The "exceptions" alias for "exc" remains in 
163353aab63bSMike Bayer    "sqlalchemy" for now, it's just not patched into 
163453aab63bSMike Bayer    sys.modules.
163553aab63bSMike Bayer
163639c79c03SMike Bayer- orm
1637eee9b55fSMike Bayer  - More succinct form of query.join(target, onclause)
1638eee9b55fSMike Bayer    [ticket:1923]
1639eee9b55fSMike Bayer
1640eee9b55fSMike Bayer  - Hybrid Attributes, implements/supercedes synonym()
1641eee9b55fSMike Bayer    [ticket:1903]
1642eee9b55fSMike Bayer
1643eee9b55fSMike Bayer  - Rewrite of composites [ticket:2008]
1644eee9b55fSMike Bayer
1645eee9b55fSMike Bayer  - Mutation Event Extension, supercedes "mutable=True"
1646eee9b55fSMike Bayer
1647eee9b55fSMike Bayer  - PickleType and ARRAY mutability turned off by default
1648eee9b55fSMike Bayer     [ticket:1980]
1649eee9b55fSMike Bayer
1650eee9b55fSMike Bayer  - Simplified polymorphic_on assignment
1651eee9b55fSMike Bayer    [ticket:1895]
1652eee9b55fSMike Bayer
1653eee9b55fSMike Bayer  - Flushing of Orphans that have no parent is allowed
1654eee9b55fSMike Bayer    [ticket:1912]
1655eee9b55fSMike Bayer
16568f381f20SMike Bayer  - Adjusted flush accounting step to occur before
16578f381f20SMike Bayer    the commit in the case of autocommit=True.  This allows
16588f381f20SMike Bayer    autocommit=True to work appropriately with 
16598f381f20SMike Bayer    expire_on_commit=True, and also allows post-flush session
16608f381f20SMike Bayer    hooks to operate in the same transactional context 
16618f381f20SMike Bayer    as when autocommit=False.  [ticket:2041]
1662ae5b58d9SMike Bayer
1663eee9b55fSMike Bayer  - Warnings generated when collection members, scalar referents 
1664eee9b55fSMike Bayer    not part of the flush
1665eee9b55fSMike Bayer    [ticket:1973]
1666eee9b55fSMike Bayer
1667eee9b55fSMike Bayer  - Non-`Table`-derived constructs can be mapped
1668eee9b55fSMike Bayer    [ticket:1876]
1669eee9b55fSMike Bayer
1670eee9b55fSMike Bayer  - Tuple label names in Query Improved
1671eee9b55fSMike Bayer    [ticket:1942]
1672eee9b55fSMike Bayer
1673eee9b55fSMike Bayer  - Mapped column attributes reference the most specific 
1674eee9b55fSMike Bayer    column first
1675eee9b55fSMike Bayer    [ticket:1892]
1676eee9b55fSMike Bayer
1677eee9b55fSMike Bayer  - Mapping to joins with two or more same-named columns 
1678eee9b55fSMike Bayer    requires explicit declaration
1679eee9b55fSMike Bayer    [ticket:1896]
1680eee9b55fSMike Bayer
1681eee9b55fSMike Bayer  - Mapper requires that polymorphic_on column be present 
1682eee9b55fSMike Bayer    in the mapped selectable
1683eee9b55fSMike Bayer    [ticket:1875]
1684eee9b55fSMike Bayer
1685eee9b55fSMike Bayer  - compile_mappers() renamed configure_mappers(), simplified 
1686eee9b55fSMike Bayer    configuration internals
1687eee9b55fSMike Bayer    [ticket:1966]
1688eee9b55fSMike Bayer
168939c79c03SMike Bayer  - the aliased() function, if passed a SQL FromClause element
169039c79c03SMike Bayer    (i.e. not a mapped class), will return element.alias() 
169139c79c03SMike Bayer    instead of raising an error on AliasedClass.  [ticket:2018]
169254085a0eSMike Bayer
1693b3dd50a8SMike Bayer  - Session.merge() will check the version id of the incoming
1694b3dd50a8SMike Bayer    state against that of the database, assuming the mapping
1695b3dd50a8SMike Bayer    uses version ids and incoming state has a version_id
1696b3dd50a8SMike Bayer    assigned, and raise StaleDataError if they don't 
1697b3dd50a8SMike Bayer    match.  [ticket:2027]
1698b3dd50a8SMike Bayer
16994a357af1SMike Bayer  - Session.connection(), Session.execute() accept 'bind',
17004a357af1SMike Bayer    to allow execute/connection operations to participate
17014a357af1SMike Bayer    in the open transaction of an engine explicitly.
17024a357af1SMike Bayer    [ticket:1996]
17034a357af1SMike Bayer
1704eee9b55fSMike Bayer  - Query.join(), Query.outerjoin(), eagerload(), 
1705eee9b55fSMike Bayer    eagerload_all(), others no longer allow lists 
1706eee9b55fSMike Bayer    of attributes as arguments (i.e. option([x, y, z]) 
1707eee9b55fSMike Bayer    form, deprecated since 0.5)
1708eee9b55fSMike Bayer
1709e6855d3fSMike Bayer  - ScopedSession.mapper is removed (deprecated since 0.5).
1710eee9b55fSMike Bayer
1711de725a0aSMike Bayer  - Horizontal shard query places 'shard_id' in 
1712de725a0aSMike Bayer    context.attributes where it's accessible by the 
1713de725a0aSMike Bayer    "load()" event. [ticket:2031]
1714de725a0aSMike Bayer
171585084caeSMike Bayer  - A single contains_eager() call across
171685084caeSMike Bayer    multiple entities will indicate all collections
171785084caeSMike Bayer    along that path should load, instead of requiring
171885084caeSMike Bayer    distinct contains_eager() calls for each endpoint
171985084caeSMike Bayer    (which was never correctly documented).
172085084caeSMike Bayer    [ticket:2032]
172185084caeSMike Bayer
172285084caeSMike Bayer  - The "name" field used in orm.aliased() now renders
172385084caeSMike Bayer    in the resulting SQL statement.
172485084caeSMike Bayer
1725a43b106aSMike Bayer  - Session weak_instance_dict=False is deprecated.
1726a43b106aSMike Bayer    [ticket:1473]
1727a43b106aSMike Bayer
1728e155b7b8SMike Bayer  - An exception is raised in the unusual case that an 
1729e155b7b8SMike Bayer    append or similar event on a collection occurs after
1730e155b7b8SMike Bayer    the parent object has been dereferenced, which 
1731e155b7b8SMike Bayer    prevents the parent from being marked as "dirty" 
1732e155b7b8SMike Bayer    in the session.  Was a warning in 0.6.6.
1733e155b7b8SMike Bayer    [ticket:2046]
1734e155b7b8SMike Bayer
17353f9a343dSMike Bayer  - Query.distinct() now accepts column expressions
17363f9a343dSMike Bayer    as *args, interpreted by the Postgresql dialect
17373f9a343dSMike Bayer    as DISTINCT ON (<expr>). [ticket:1069]
17383f9a343dSMike Bayer
1739d7fda4aeSMike Bayer  - Additional tuning to "many-to-one" relationship
1740d7fda4aeSMike Bayer    loads during a flush().   A change in version 0.6.6
1741d7fda4aeSMike Bayer    ([ticket:2002]) required that more "unnecessary" m2o 
1742d7fda4aeSMike Bayer    loads during a flush could occur.   Extra loading modes have
1743d7fda4aeSMike Bayer    been added so that the SQL emitted in this 
1744d7fda4aeSMike Bayer    specific use case is trimmed back, while still
1745d7fda4aeSMike Bayer    retrieving the information the flush needs in order
1746d7fda4aeSMike Bayer    to not miss anything.  [ticket:2049]
1747d7fda4aeSMike Bayer
17482a289e91SMike Bayer  - the value of "passive" as passed to 
17492a289e91SMike Bayer    attributes.get_history() should be one of the 
17502a289e91SMike Bayer    constants defined in the attributes package.  Sending 
17512a289e91SMike Bayer    True or False is deprecated.
17522a289e91SMike Bayer
1753cddf5856SMike Bayer  - Added a `name` argument to `Query.subquery()`, to allow
1754cddf5856SMike Bayer    a fixed name to be assigned to the alias object.
1755cddf5856SMike Bayer    [ticket:2030] (also in 0.6.7)
1756cddf5856SMike Bayer
1757cddf5856SMike Bayer  - A warning is emitted when a joined-table inheriting mapper
1758cddf5856SMike Bayer    has no primary keys on the locally mapped table
1759cddf5856SMike Bayer    (but has pks on the superclass table).  [ticket:2019]
1760cddf5856SMike Bayer    (also in 0.6.7)
1761cddf5856SMike Bayer
1762cddf5856SMike Bayer  - Fixed bug where "middle" class in a polymorphic hierarchy
1763cddf5856SMike Bayer    would have no 'polymorphic_on' column if it didn't also
1764cddf5856SMike Bayer    specify a 'polymorphic_identity', leading to strange
1765cddf5856SMike Bayer    errors upon refresh, wrong class loaded when querying
1766cddf5856SMike Bayer    from that target. Also emits the correct WHERE criterion
1767cddf5856SMike Bayer    when using single table inheritance. [ticket:2038]
1768cddf5856SMike Bayer    (also in 0.6.7)
1769cddf5856SMike Bayer
1770cddf5856SMike Bayer - Fixed bug where a column with a SQL or server side default
1771cddf5856SMike Bayer   that was excluded from a mapping with include_properties
1772cddf5856SMike Bayer   or exclude_properties would result in UnmappedColumnError.
1773cddf5856SMike Bayer   [ticket:1995] (also in 0.6.7)
1774cddf5856SMike Bayer
1775cddf5856SMike Bayer  - A warning is emitted in the unusual case that an
1776cddf5856SMike Bayer    append or similar event on a collection occurs after
1777cddf5856SMike Bayer    the parent object has been dereferenced, which
1778cddf5856SMike Bayer    prevents the parent from being marked as "dirty"
1779cddf5856SMike Bayer    in the session.  This will be an exception in 0.7.
1780cddf5856SMike Bayer    [ticket:2046] (also in 0.6.7)
1781cddf5856SMike Bayer
1782cddf5856SMike Bayer- declarative
1783cddf5856SMike Bayer  - Added an explicit check for the case that the name
1784cddf5856SMike Bayer    'metadata' is used for a column attribute on a
1785cddf5856SMike Bayer    declarative class. [ticket:2050] (also in 0.6.7)
1786cddf5856SMike Bayer
178715ea17d7SMichael Trier- sql
1788020d6ef8SMike Bayer  - Added over() function, method to FunctionElement
1789020d6ef8SMike Bayer    classes, produces the _Over() construct which 
1790020d6ef8SMike Bayer    in turn generates "window functions", i.e.
1791020d6ef8SMike Bayer    "<window function> OVER (PARTITION BY <partition by>,
1792020d6ef8SMike Bayer    ORDER BY <order by>)".
1793020d6ef8SMike Bayer    [ticket:1844]
1794020d6ef8SMike Bayer
1795eee9b55fSMike Bayer  - LIMIT/OFFSET clauses now use bind parameters
1796eee9b55fSMike Bayer    [ticket:805]
1797eee9b55fSMike Bayer
17983f9a343dSMike Bayer  - select.distinct() now accepts column expressions
17993f9a343dSMike Bayer    as *args, interpreted by the Postgresql dialect
18003f9a343dSMike Bayer    as DISTINCT ON (<expr>).  Note this was already
18013f9a343dSMike Bayer    available via passing a list to the `distinct` 
18023f9a343dSMike Bayer    keyword argument to select(). [ticket:1069]
18033f9a343dSMike Bayer
18043f9a343dSMike Bayer  - select.prefix_with() accepts multiple expressions
18053f9a343dSMike Bayer    (i.e. *expr), 'prefix' keyword argument to select()
18063f9a343dSMike Bayer    accepts a list or tuple.
18073f9a343dSMike Bayer
18083f9a343dSMike Bayer  - Passing a string to the `distinct` keyword argument
18093f9a343dSMike Bayer    of `select()` for the purpose of emitting special 
18103f9a343dSMike Bayer    MySQL keywords (DISTINCTROW etc.) is deprecated - 
18113f9a343dSMike Bayer    use `prefix_with()` for this.
18123f9a343dSMike Bayer
1813e6855d3fSMike Bayer  - TypeDecorator works with primary key columns
1814e6855d3fSMike Bayer    [ticket:2005] [ticket:2006]
1815eee9b55fSMike Bayer
1816e6855d3fSMike Bayer  - DDL() constructs now escape percent signs
1817e6855d3fSMike Bayer    [ticket:1897]
1818eee9b55fSMike Bayer
1819e6855d3fSMike Bayer  - Table.c / MetaData.tables refined a bit, don't allow direct 
1820e6855d3fSMike Bayer    mutation  [ticket:1893] [ticket:1917]
1821eee9b55fSMike Bayer
1822e6855d3fSMike Bayer  - Callables passed to `bindparam()` don't get evaluated
1823e6855d3fSMike Bayer    [ticket:1950]
1824eee9b55fSMike Bayer
1825e6855d3fSMike Bayer  - types.type_map is now private, types._type_map
1826e6855d3fSMike Bayer    [ticket:1870]
1827eee9b55fSMike Bayer
1828e6855d3fSMike Bayer  - Non-public Pool methods underscored
1829e6855d3fSMike Bayer    [ticket:1982]
1830eee9b55fSMike Bayer
183115ea17d7SMichael Trier  - Added NULLS FIRST and NULLS LAST support. It's implemented
183215ea17d7SMichael Trier    as an extension to the asc() and desc() operators, called
183315ea17d7SMichael Trier    nullsfirst() and nullslast().  [ticket:723]
183415ea17d7SMichael Trier
1835e46301b5SMike Bayer  - The Index() construct can be created inline with a Table
1836e46301b5SMike Bayer    definition, using strings as column names, as an alternative
1837e46301b5SMike Bayer    to the creation of the index outside of the Table.
1838e46301b5SMike Bayer
18397325ba60SMike Bayer  - execution_options() on Connection accepts 
18407325ba60SMike Bayer    "isolation_level" argument, sets transaction isolation
18417325ba60SMike Bayer    level for that connection only until returned to the
18427325ba60SMike Bayer    connection pool, for thsoe backends which support it
18437325ba60SMike Bayer    (SQLite, Postgresql) [ticket:2001]
18447325ba60SMike Bayer
184567e0f356SMike Bayer  - A TypeDecorator of Integer can be used with a primary key
184667e0f356SMike Bayer    column, and the "autoincrement" feature of various dialects
184767e0f356SMike Bayer    as well as the "sqlite_autoincrement" flag will honor
184867e0f356SMike Bayer    the underlying database type as being Integer-based.
184967e0f356SMike Bayer    [ticket:2005]
185067e0f356SMike Bayer
1851aedd34f3SMike Bayer  - Established consistency when server_default is present
1852aedd34f3SMike Bayer    on an Integer PK column.  SQLA doesn't pre-fetch these,
1853e30d02c6SMike Bayer    nor do they come back in cursor.lastrowid (DBAPI).
1854aedd34f3SMike Bayer    Ensured all backends consistently return None 
1855aedd34f3SMike Bayer    in result.inserted_primary_key for these. Regarding
1856aedd34f3SMike Bayer    reflection for this case, reflection of an int PK col 
1857aedd34f3SMike Bayer    with a server_default sets the "autoincrement" flag to False, 
1858aedd34f3SMike Bayer    except in the case of a PG SERIAL col where we detected a 
1859aedd34f3SMike Bayer    sequence default. [ticket:2020] [ticket:2021]
1860aedd34f3SMike Bayer
186167e0f356SMike Bayer  - Result-row processors are applied to pre-executed SQL 
186267e0f356SMike Bayer    defaults, as well as cursor.lastrowid, when determining
186367e0f356SMike Bayer    the contents of result.inserted_primary_key.
186467e0f356SMike Bayer    [ticket:2006]
186567e0f356SMike Bayer
186667e0f356SMike Bayer  - Bind parameters present in the "columns clause" of a select
186767e0f356SMike Bayer    are now auto-labeled like other "anonymous" clauses,
186867e0f356SMike Bayer    which among other things allows their "type" to be meaningful
186967e0f356SMike Bayer    when the row is fetched, as in result row processors.
187067e0f356SMike Bayer
187167e0f356SMike Bayer  - TypeDecorator is present in the "sqlalchemy" import space.
187267e0f356SMike Bayer
18737e8f3510SMike Bayer  - Non-DBAPI errors which occur in the scope of an `execute()`
18747e8f3510SMike Bayer    call are now wrapped in sqlalchemy.exc.StatementError,
18757e8f3510SMike Bayer    and the text of the SQL statement and repr() of params
18767e8f3510SMike Bayer    is included.  This makes it easier to identify statement
18777e8f3510SMike Bayer    executions which fail before the DBAPI becomes 
18787e8f3510SMike Bayer    involved.  [ticket:2015]
18797e8f3510SMike Bayer
1880848257f7SMike Bayer  - The concept of associating a ".bind" directly with a 
1881848257f7SMike Bayer    ClauseElement has been explicitly moved to Executable,
1882848257f7SMike Bayer    i.e. the mixin that describes ClauseElements which represent
1883848257f7SMike Bayer    engine-executable constructs.  This change is an improvement
1884848257f7SMike Bayer    to internal organization and is unlikely to affect any 
1885848257f7SMike Bayer    real-world usage.  [ticket:2048]
1886848257f7SMike Bayer
1887cddf5856SMike Bayer  - Column.copy(), as used in table.tometadata(), copies the
1888cddf5856SMike Bayer    'doc' attribute.  [ticket:2028] (also in 0.6.7)
1889cddf5856SMike Bayer
1890cddf5856SMike Bayer  - Added some defs to the resultproxy.c extension so that
1891cddf5856SMike Bayer    the extension compiles and runs on Python 2.4.
1892cddf5856SMike Bayer    [ticket:2023] (also in 0.6.7)
1893cddf5856SMike Bayer
1894cddf5856SMike Bayer  - The compiler extension now supports overriding the default
1895cddf5856SMike Bayer    compilation of expression._BindParamClause including that
1896cddf5856SMike Bayer    the auto-generated binds within the VALUES/SET clause
1897cddf5856SMike Bayer    of an insert()/update() statement will also use the new
1898cddf5856SMike Bayer    compilation rules. [ticket:2042] (also in 0.6.7)
1899cddf5856SMike Bayer
1900eee9b55fSMike Bayer-sqlite
1901eee9b55fSMike Bayer  - SQLite dialect now uses `NullPool` for file-based databases
1902eee9b55fSMike Bayer    [ticket:1921]
1903eee9b55fSMike Bayer
1904e43f8596SMike Bayer  - The path given as the location of a sqlite database is now
1905e43f8596SMike Bayer    normalized via os.path.abspath(), so that directory changes
1906e43f8596SMike Bayer    within the process don't affect the ultimate location
1907e43f8596SMike Bayer    of a relative file path.  [ticket:2036]
1908e43f8596SMike Bayer
1909cddf5856SMike Bayer- postgresql
1910cddf5856SMike Bayer  - When explicit sequence execution derives the name
1911cddf5856SMike Bayer    of the auto-generated sequence of a SERIAL column,
1912cddf5856SMike Bayer    which currently only occurs if implicit_returning=False,
1913cddf5856SMike Bayer    now accommodates if the table + column name is greater
1914cddf5856SMike Bayer    than 63 characters using the same logic Postgresql uses.
1915cddf5856SMike Bayer    [ticket:1083] (also in 0.6.7)
1916cddf5856SMike Bayer
1917cddf5856SMike Bayer  - Added an additional libpq message to the list of "disconnect"
1918cddf5856SMike Bayer    exceptions, "could not receive data from server"
1919cddf5856SMike Bayer    [ticket:2044] (also in 0.6.7)
1920cddf5856SMike Bayer
192154085a0eSMike Bayer- mssql
192254085a0eSMike Bayer  - the String/Unicode types, and their counterparts VARCHAR/
192354085a0eSMike Bayer    NVARCHAR, emit "max" as the length when no length is 
1924bc52cae4SMike Bayer    specified, so that the default length, normally '1' 
1925bc52cae4SMike Bayer    as per SQL server documentation, is instead
1926bc52cae4SMike Bayer    'unbounded'.  This also occurs for the VARBINARY type.
1927bc52cae4SMike Bayer    [ticket:1833].
1928bc52cae4SMike Bayer
1929bc52cae4SMike Bayer    This behavior makes these types more closely compatible 
1930bc52cae4SMike Bayer    with Postgresql's VARCHAR type which is similarly unbounded 
1931bc52cae4SMike Bayer    when no length is specified.
1932350aed3fSMike Bayer
19331515073bSMike Bayer- mysql
19341515073bSMike Bayer  - New DBAPI support for pymysql, a pure Python port
19351515073bSMike Bayer    of MySQL-python.  [ticket:1991]
19361515073bSMike Bayer
1937cddf5856SMike Bayer  - oursql dialect accepts the same "ssl" arguments in
1938cddf5856SMike Bayer    create_engine() as that of MySQLdb.  [ticket:2047]
1939cddf5856SMike Bayer    (also in 0.6.7)
1940cddf5856SMike Bayer
19415a2c332fSMike Bayer- firebird
19425a2c332fSMike Bayer  - Some adjustments so that Interbase is supported as well.
19435a2c332fSMike Bayer    FB/Interbase version idents are parsed into a structure
19445a2c332fSMike Bayer    such as (8, 1, 1, 'interbase') or (2, 1, 588, 'firebird')
19455a2c332fSMike Bayer    so they can be distinguished. [ticket:1885]
19465a2c332fSMike Bayer
19479122268eSMike Bayer- drizzle
19489122268eSMike Bayer  - New dialect for Drizzle, a MySQL variant.  Uses MySQL-python
19499122268eSMike Bayer    for the DBAPI.  [ticket:2003]
19509122268eSMike Bayer
1951cddf5856SMike Bayer0.6.7 - 0.6.xx
1952cddf5856SMike Bayer==============
1953ff1868b3SMike Bayer
1954cddf5856SMike BayerChanges which apply to 0.6.7 and subsequent versions of 0.6
1955cddf5856SMike Bayerare listed in the CHANGES file within the 0.6 branch.  All
1956cddf5856SMike Bayerthose changes which are also in the 0.7 series (which is typically
1957cddf5856SMike Bayerall of them) are listed inline within the 0.7 changes above,
1958cddf5856SMike Bayerthose which apply to an 0.6 release are noted.
1959ff1868b3SMike Bayer
19600d00f470SMike Bayer0.6.6
19610d00f470SMike Bayer=====
19620d00f470SMike Bayer- orm
19630d00f470SMike Bayer  - Fixed bug whereby a non-"mutable" attribute modified event
19640d00f470SMike Bayer    which occurred on an object that was clean except for
19650d00f470SMike Bayer    preceding mutable attribute changes would fail to strongly
19660d00f470SMike Bayer    reference itself in the identity map. This would cause the
19670d00f470SMike Bayer    object to be garbage collected, losing track of any changes
19680d00f470SMike Bayer    that weren't previously saved in the "mutable changes"
19690d00f470SMike Bayer    dictionary.
1970855dbda8SMike Bayer
1971848a56eaSMike Bayer  - Fixed bug whereby "passive_deletes='all'" wasn't passing
1972848a56eaSMike Bayer    the correct symbols to lazy loaders during flush, thereby
1973848a56eaSMike Bayer    causing an unwarranted load.  [ticket:2013]
1974848a56eaSMike Bayer
1975b0f48ca2SMike Bayer  - Fixed bug which prevented composite mapped
1976b0f48ca2SMike Bayer    attributes from being used on a mapped select statement. 
1977b0f48ca2SMike Bayer    [ticket:1997]. Note the workings of composite are slated to 
1978b0f48ca2SMike Bayer    change significantly in 0.7.
1979b0f48ca2SMike Bayer
1980b0f48ca2SMike Bayer  - active_history flag also added to composite(). 
1981b0f48ca2SMike Bayer    The flag has no effect in 0.6, but is instead 
1982b0f48ca2SMike Bayer    a placeholder flag for forwards compatibility,
1983b0f48ca2SMike Bayer    as it applies in 0.7 for composites.
1984b0f48ca2SMike Bayer    [ticket:1976]
1985b0f48ca2SMike Bayer
198680ae02f7SMike Bayer  - Fixed uow bug whereby expired objects passed to 
198780ae02f7SMike Bayer    Session.delete() would not have unloaded references 
198880ae02f7SMike Bayer    or collections taken into account when deleting
198980ae02f7SMike Bayer    objects, despite passive_deletes remaining at 
199080ae02f7SMike Bayer    its default of False.  [ticket:2002]
1991350aed3fSMike Bayer
19923351c35eSMike Bayer  - A warning is emitted when version_id_col is specified
19933351c35eSMike Bayer    on an inheriting mapper when the inherited mapper
19943351c35eSMike Bayer    already has one, if those column expressions are not
19953351c35eSMike Bayer    the same.  [ticket:1987]
1996350aed3fSMike Bayer
199730bc4240SMike Bayer  - "innerjoin" flag doesn't take effect along the chain
199830bc4240SMike Bayer    of joinedload() joins if a previous join in that chain
199930bc4240SMike Bayer    is an outer join, thus allowing primary rows without
200030bc4240SMike Bayer    a referenced child row to be correctly returned
200130bc4240SMike Bayer    in results.  [ticket:1954]
2002a41c50adSMike Bayer
2003bcf577c1SMike Bayer  - Fixed bug regarding "subqueryload" strategy whereby
2004bcf577c1SMike Bayer    strategy would fail if the entity was an aliased()
2005bcf577c1SMike Bayer    construct.  [ticket:1964]
2006588f7402SMike Bayer
20079f3b42cbSMike Bayer  - Fixed bug regarding "subqueryload" strategy whereby
20089f3b42cbSMike Bayer    the join would fail if using a multi-level load
20099f3b42cbSMike Bayer    of the form from A->joined-subclass->C [ticket:2014]
20109f3b42cbSMike Bayer
20114efb0747SMike Bayer  - Fixed indexing of Query objects by -1. It was erroneously
20124efb0747SMike Bayer    transformed to the empty slice -1:0 that resulted in
20134efb0747SMike Bayer    IndexError. [ticket:1968]
20144efb0747SMike Bayer
201508257953SMike Bayer  - The mapper argument "primary_key" can be passed as a 
201608257953SMike Bayer    single column as well as a list or tuple.  [ticket:1971]
201708257953SMike Bayer    The documentation examples that illustrated it as a 
2018350aed3fSMike Bayer    scalar value have been changed to lists.
2019d0dc622dSMike Bayer
2020d0dc622dSMike Bayer  - Added active_history flag to relationship()
2021d0dc622dSMike Bayer    and column_property(), forces attribute events to
2022d0dc622dSMike Bayer    always load the "old" value, so that it's available to
2023d0dc622dSMike Bayer    attributes.get_history(). [ticket:1961]
2024350aed3fSMike Bayer
202552167e1cSMike Bayer  - Query.get() will raise if the number of params
202652167e1cSMike Bayer    in a composite key is too large, as well as too 
202752167e1cSMike Bayer    small. [ticket:1977]
2028c8f8124cSMike Bayer
2029c8f8124cSMike Bayer  - Backport of "optimized get" fix from 0.7,
2030c8f8124cSMike Bayer    improves the generation of joined-inheritance
2031c8f8124cSMike Bayer    "load expired row" behavior.  [ticket:1992]
2032c8f8124cSMike Bayer
203374b7bd43SMike Bayer  - A little more verbiage to the "primaryjoin" error,
203474b7bd43SMike Bayer    in an unusual condition that the join condition
203574b7bd43SMike Bayer    "works" for viewonly but doesn't work for non-viewonly,
203674b7bd43SMike Bayer    and foreign_keys wasn't used - adds "foreign_keys" to
203774b7bd43SMike Bayer    the suggestion.  Also add "foreign_keys" to the 
203874b7bd43SMike Bayer    suggestion for the generic "direction" error.
2039350aed3fSMike Bayer
2040588f7402SMike Bayer- sql
204177f64142SMike Bayer  - Fixed operator precedence rules for multiple
204277f64142SMike Bayer    chains of a single non-associative operator.
204377f64142SMike Bayer    I.e. "x - (y - z)" will compile as "x - (y - z)"
204477f64142SMike Bayer    and not "x - y - z".  Also works with labels,
204577f64142SMike Bayer    i.e. "x - (y - z).label('foo')"
204677f64142SMike Bayer    [ticket:1984]
2047350aed3fSMike Bayer
2048588f7402SMike Bayer  - The 'info' attribute of Column is copied during 
2049588f7402SMike Bayer    Column.copy(), i.e. as occurs when using columns
2050588f7402SMike Bayer    in declarative mixins.  [ticket:1967]
205140d5a32eSMike Bayer
205240d5a32eSMike Bayer  - Added a bind processor for booleans which coerces
205340d5a32eSMike Bayer    to int, for DBAPIs such as pymssql that naively call 
205440d5a32eSMike Bayer    str() on values.
2055350aed3fSMike Bayer
20564e9e0f04SMike Bayer  - CheckConstraint will copy its 'initially', 'deferrable',
20574e9e0f04SMike Bayer    and '_create_rule' attributes within a copy()/tometadata()
20584e9e0f04SMike Bayer    [ticket:2000]
20594e9e0f04SMike Bayer
2060a41c50adSMike Bayer- engine
206146ad83edSMike Bayer  - The "unicode warning" against non-unicode bind data
206246ad83edSMike Bayer    is now raised only when the
206346ad83edSMike Bayer    Unicode type is used explictly; not when 
206446ad83edSMike Bayer    convert_unicode=True is used on the engine 
206546ad83edSMike Bayer    or String type.
2066350aed3fSMike Bayer
2067a967dffbSMike Bayer  - Fixed memory leak in C version of Decimal result
2068a967dffbSMike Bayer    processor.  [ticket:1978]
2069350aed3fSMike Bayer
2070a41c50adSMike Bayer  - Implemented sequence check capability for the C 
2071a41c50adSMike Bayer    version of RowProxy, as well as 2.7 style 
2072a41c50adSMike Bayer    "collections.Sequence" registration for RowProxy.
2073a41c50adSMike Bayer    [ticket:1871]
207434cb747fSMike Bayer
20758df4dc43SMike Bayer  - Threadlocal engine methods rollback(), commit(),
20768df4dc43SMike Bayer    prepare() won't raise if no transaction is in progress;
20778df4dc43SMike Bayer    this was a regression introduced in 0.6.  [ticket:1998]
2078350aed3fSMike Bayer
20794e9e0f04SMike Bayer  - Threadlocal engine returns itself upon begin(),
20804e9e0f04SMike Bayer    begin_nested(); engine then implements contextmanager
20814e9e0f04SMike Bayer    methods to allow the "with" statement. [ticket:2004]
20824e9e0f04SMike Bayer
208334cb747fSMike Bayer- postgresql
208477f64142SMike Bayer  - Single element tuple expressions inside an IN clause
208577f64142SMike Bayer    parenthesize correctly, also from [ticket:1984]
2086350aed3fSMike Bayer
208734cb747fSMike Bayer  - Ensured every numeric, float, int code, scalar + array,
208834cb747fSMike Bayer    are recognized by psycopg2 and pg8000's "numeric" 
208934cb747fSMike Bayer    base type. [ticket:1955]
20902336b1ceSMike Bayer
20912336b1ceSMike Bayer  - Added as_uuid=True flag to the UUID type, will receive
20922336b1ceSMike Bayer    and return values as Python UUID() objects rather than
20932336b1ceSMike Bayer    strings.  Currently, the UUID type is only known to 
20942336b1ceSMike Bayer    work with psycopg2.  [ticket:1956]
2095582b1215SMike Bayer
2096582b1215SMike Bayer  - Fixed bug whereby KeyError would occur with non-ENUM 
2097582b1215SMike Bayer    supported PG versions after a pool dispose+recreate
2098582b1215SMike Bayer    would occur, [ticket:1989]
2099350aed3fSMike Bayer
2100855dbda8SMike Bayer- mysql
2101855dbda8SMike Bayer  - Fixed error handling for Jython + zxjdbc, such that 
2102855dbda8SMike Bayer    has_table() property works again.  Regression from
2103855dbda8SMike Bayer    0.6.3 (we don't have a Jython buildbot, sorry)
2104855dbda8SMike Bayer    [ticket:1960]
2105bbe3f0a2SMike Bayer
2106bbe3f0a2SMike Bayer- sqlite
2107bbe3f0a2SMike Bayer  - The REFERENCES clause in a CREATE TABLE that includes
2108d3ee4f61SMike Bayer    a remote schema to another table with the same schema 
2109d3ee4f61SMike Bayer    name now renders the remote name without
2110bbe3f0a2SMike Bayer    the schema clause, as required by SQLite.  [ticket:1851]
2111d3ee4f61SMike Bayer
2112d3ee4f61SMike Bayer  - On the same theme, the REFERENCES clause in a CREATE TABLE
2113d3ee4f61SMike Bayer    that includes a remote schema to a *different* schema
2114d3ee4f61SMike Bayer    than that of the parent table doesn't render at all,
2115d3ee4f61SMike Bayer    as cross-schema references do not appear to be supported.
2116d3ca4156SMike Bayer
211746ad83edSMike Bayer- mssql
211846ad83edSMike Bayer   - The rewrite of index reflection in [ticket:1770] was
211946ad83edSMike Bayer     unfortunately not tested correctly, and returned incorrect
212046ad83edSMike Bayer     results.   This regression is now fixed.
212146ad83edSMike Bayer
212237644a64SMike Bayer- oracle
212337644a64SMike Bayer  - The cx_oracle "decimal detection" logic, which takes place
212437644a64SMike Bayer    for for result set columns with ambiguous numeric characteristics,
212537644a64SMike Bayer    now uses the decimal point character determined by the locale/
212637644a64SMike Bayer    NLS_LANG setting, using an on-first-connect detection of 
212737644a64SMike Bayer    this character.  cx_oracle 5.0.3 or greater is also required
212837644a64SMike Bayer    when using a non-period-decimal-point NLS_LANG setting.
212937644a64SMike Bayer    [ticket:1953].
2130350aed3fSMike Bayer
21316e023b16SMike Bayer- firebird
21326e023b16SMike Bayer  - Firebird numeric type now checks for Decimal explicitly,
21336e023b16SMike Bayer    lets float() pass right through, thereby allowing 
21346e023b16SMike Bayer    special values such as float('inf'). [ticket:2012]
21356e023b16SMike Bayer
2136d3ca4156SMike Bayer- declarative
2137d3ca4156SMike Bayer  - An error is raised if __table_args__ is not in tuple
2138d3ca4156SMike Bayer    or dict format, and is not None.  [ticket:1972]
2139c848624fSMike Bayer
2140c848624fSMike Bayer- sqlsoup
2141c848624fSMike Bayer  - Added "map_to()" method to SqlSoup, which is a "master"
2142c848624fSMike Bayer    method which accepts explicit arguments for each aspect of
2143c848624fSMike Bayer    the selectable and mapping, including a base class per
2144c848624fSMike Bayer    mapping. [ticket:1975]
2145c848624fSMike Bayer
2146c848624fSMike Bayer  - Mapped selectables used with the map(), with_labels(),
2147c848624fSMike Bayer    join() methods no longer put the given argument into the
2148c848624fSMike Bayer    internal "cache" dictionary.  Particularly since the
2149c848624fSMike Bayer    join() and select() objects are created in the method
2150c848624fSMike Bayer    itself this was pretty much a pure memory leaking behavior.
215109534eafSMike Bayer
215209534eafSMike Bayer- examples
215309534eafSMike Bayer  - The versioning example now supports detection of changes
215409534eafSMike Bayer    in an associated relationship().
2155350aed3fSMike Bayer
21569674b4bfSMike Bayer0.6.5
21579674b4bfSMike Bayer=====
21589674b4bfSMike Bayer- orm
2159350aed3fSMike Bayer  - Added a new "lazyload" option "immediateload".
2160295fd901SMike Bayer    Issues the usual "lazy" load operation automatically
2161295fd901SMike Bayer    as the object is populated.   The use case
2162295fd901SMike Bayer    here is when loading objects to be placed in
2163295fd901SMike Bayer    an offline cache, or otherwise used after
2164295fd901SMike Bayer    the session isn't available, and straight 'select'
2165295fd901SMike Bayer    loading, not 'joined' or 'subquery', is desired.
2166295fd901SMike Bayer    [ticket:1914]
2167350aed3fSMike Bayer
216892fb9f91SMike Bayer  - New Query methods: query.label(name), query.as_scalar(),
216992fb9f91SMike Bayer    return the query's statement as a scalar subquery
217092fb9f91SMike Bayer    with /without label [ticket:1920];
217192fb9f91SMike Bayer    query.with_entities(*ent), replaces the SELECT list of 
217292fb9f91SMike Bayer    the query with new entities. 
217392fb9f91SMike Bayer    Roughly equivalent to a generative form of query.values()
217492fb9f91SMike Bayer    which accepts mapped entities as well as column 
217592fb9f91SMike Bayer    expressions.
2176350aed3fSMike Bayer
2177f5d2bb60SMike Bayer  - Fixed recursion bug which could occur when moving
2178f5d2bb60SMike Bayer    an object from one reference to another, with 
2179f5d2bb60SMike Bayer    backrefs involved, where the initiating parent
2180f5d2bb60SMike Bayer    was a subclass (with its own mapper) of the 
2181f5d2bb60SMike Bayer    previous parent.
21826409a06dSMike Bayer
2183e79158e2SMike Bayer  - Fixed a regression in 0.6.4 which occurred if you 
21846409a06dSMike Bayer    passed an empty list to "include_properties" on 
21856409a06dSMike Bayer    mapper() [ticket:1918]
2186350aed3fSMike Bayer
2187b47983f8SMike Bayer  - Fixed labeling bug in Query whereby the NamedTuple
2188b47983f8SMike Bayer    would mis-apply labels if any of the column
2189b47983f8SMike Bayer    expressions were un-labeled.
2190350aed3fSMike Bayer
2191c9125a9eSMike Bayer  - Patched a case where query.join() would adapt the
2192c9125a9eSMike Bayer    right side to the right side of the left's join
2193c9125a9eSMike Bayer    inappropriately [ticket:1925]
21947b8b23b4SMike Bayer
21957b8b23b4SMike Bayer  - Query.select_from() has been beefed up to help
21967b8b23b4SMike Bayer    ensure that a subsequent call to query.join()
21977b8b23b4SMike Bayer    will use the select_from() entity, assuming it's
21987b8b23b4SMike Bayer    a mapped entity and not a plain selectable, 
21997b8b23b4SMike Bayer    as the default "left" side, not the first entity 
22007b8b23b4SMike Bayer    in the Query object's list of entities.
2201350aed3fSMike Bayer
220252735e75SMike Bayer  - The exception raised by Session when it is used
220352735e75SMike Bayer    subsequent to a subtransaction rollback (which is what
220452735e75SMike Bayer    happens when a flush fails in autocommit=False mode) has
220552735e75SMike Bayer    now been reworded (this is the "inactive due to a
220652735e75SMike Bayer    rollback in a subtransaction" message). In particular,
220752735e75SMike Bayer    if the rollback was due to an exception during flush(),
220852735e75SMike Bayer    the message states this is the case, and reiterates the
220952735e75SMike Bayer    string form of the original exception that occurred
221052735e75SMike Bayer    during flush. If the session is closed due to explicit
221152735e75SMike Bayer    usage of subtransactions (not very common), the message
221252735e75SMike Bayer    just states this is the case.
221352735e75SMike Bayer
221452735e75SMike Bayer  - The exception raised by Mapper when repeated requests to
221552735e75SMike Bayer    its initialization are made after initialization already
221652735e75SMike Bayer    failed no longer assumes the "hasattr" case, since
221752735e75SMike Bayer    there's other scenarios in which this message gets
221852735e75SMike Bayer    emitted, and the message also does not compound onto
221952735e75SMike Bayer    itself multiple times - you get the same message for
222052735e75SMike Bayer    each attempt at usage. The misnomer "compiles" is being
222152735e75SMike Bayer    traded out for "initialize".
22224557fd5aSMike Bayer
22234557fd5aSMike Bayer  - Fixed bug in query.update() where 'evaluate' or 'fetch'
22244557fd5aSMike Bayer    expiration would fail if the column expression key was
22254557fd5aSMike Bayer    a class attribute with a different keyname as the 
22264557fd5aSMike Bayer    actual column name.  [ticket:1935]
2227350aed3fSMike Bayer
22289674b4bfSMike Bayer  - Added an assertion during flush which ensures
22299674b4bfSMike Bayer    that no NULL-holding identity keys were generated
22309674b4bfSMike Bayer    on "newly persistent" objects.
22319674b4bfSMike Bayer    This can occur when user defined code inadvertently
22329674b4bfSMike Bayer    triggers flushes on not-fully-loaded objects.
2233bad44938SMike Bayer
2234fe250af8SMike Bayer  - lazy loads for relationship attributes now use
2235fe250af8SMike Bayer    the current state, not the "committed" state,
2236fe250af8SMike Bayer    of foreign and primary key attributes
2237fe250af8SMike Bayer    when issuing SQL, if a flush is not in process.
2238fe250af8SMike Bayer    Previously, only the database-committed state would 
2239fe250af8SMike Bayer    be used.  In particular, this would cause a many-to-one
2240fe250af8SMike Bayer    get()-on-lazyload operation to fail, as autoflush
2241fe250af8SMike Bayer    is not triggered on these loads when the attributes are
2242fe250af8SMike Bayer    determined and the "committed" state may not be 
2243fe250af8SMike Bayer    available.  [ticket:1910]
2244350aed3fSMike Bayer
2245fe250af8SMike Bayer  - A new flag on relationship(), load_on_pending, allows
2246fe250af8SMike Bayer    the lazy loader to fire off on pending objects without a
2247fe250af8SMike Bayer    flush taking place, as well as a transient object that's
2248fe250af8SMike Bayer    been manually "attached" to the session. Note that this
2249fe250af8SMike Bayer    flag blocks attribute events from taking place when an
2250fe250af8SMike Bayer    object is loaded, so backrefs aren't available until
2251fe250af8SMike Bayer    after a flush. The flag is only intended for very
2252fe250af8SMike Bayer    specific use cases.
2253350aed3fSMike Bayer
2254eae4de02SMike Bayer  - Another new flag on relationship(), cascade_backrefs,
2255eae4de02SMike Bayer    disables the "save-update" cascade when the event was
2256eae4de02SMike Bayer    initiated on the "reverse" side of a bidirectional 
2257eae4de02SMike Bayer    relationship.   This is a cleaner behavior so that
2258eae4de02SMike Bayer    many-to-ones can be set on a transient object without
2259eae4de02SMike Bayer    it getting sucked into the child object's session,
2260eae4de02SMike Bayer    while still allowing the forward collection to 
2261eae4de02SMike Bayer    cascade.   We *might* default this to False in 0.7.
2262350aed3fSMike Bayer
226352735e75SMike Bayer  - Slight improvement to the behavior of
226452735e75SMike Bayer    "passive_updates=False" when placed only on the
226552735e75SMike Bayer    many-to-one side of a relationship; documentation has
226652735e75SMike Bayer    been clarified that passive_updates=False should really
226752735e75SMike Bayer    be on the one-to-many side.
2268bad44938SMike Bayer
2269bad44938SMike Bayer  - Placing passive_deletes=True on a many-to-one emits
2270bad44938SMike Bayer    a warning, since you probably intended to put it on
2271bad44938SMike Bayer    the one-to-many side.
2272350aed3fSMike Bayer
227303523970SMike Bayer  - Fixed bug that would prevent "subqueryload" from
227403523970SMike Bayer    working correctly with single table inheritance 
227503523970SMike Bayer    for a relationship from a subclass - the "where 
227603523970SMike Bayer    type in (x, y, z)" only gets placed on the inside,
227703523970SMike Bayer    instead of repeatedly.
2278350aed3fSMike Bayer
227903523970SMike Bayer  - When using from_self() with single table inheritance,
228003523970SMike Bayer    the "where type in (x, y, z)" is placed on the outside
228103523970SMike Bayer    of the query only, instead of repeatedly.   May make
228203523970SMike Bayer    some more adjustments to this.
228390d4cdbaSMike Bayer
2284634d5474SMike Bayer  - scoped_session emits a warning when configure() is 
2285634d5474SMike Bayer    called if a Session is already present (checks only the
2286634d5474SMike Bayer    current thread) [ticket:1924]
2287755aca7fSMike Bayer
2288755aca7fSMike Bayer  - reworked the internals of mapper.cascade_iterator() to
2289755aca7fSMike Bayer    cut down method calls by about 9% in some circumstances.
2290755aca7fSMike Bayer    [ticket:1932]
2291350aed3fSMike Bayer
2292611fb771SMike Bayer- sql
2293ee345b05SMike Bayer   - Fixed bug in TypeDecorator whereby the dialect-specific
2294ee345b05SMike Bayer     type was getting pulled in to generate the DDL for a 
2295ee345b05SMike Bayer     given type, which didn't always return the correct result.
2296350aed3fSMike Bayer
2297ee345b05SMike Bayer   - TypeDecorator can now have a fully constructed type
2298ee345b05SMike Bayer     specified as its "impl", in addition to a type class.
2299ee345b05SMike Bayer
2300ee345b05SMike Bayer   - TypeDecorator will now place itself as the resulting
2301ee345b05SMike Bayer     type for a binary expression where the type coercion
2302ee345b05SMike Bayer     rules would normally return its impl type - previously,
2303ee345b05SMike Bayer     a copy of the impl type would be returned which would
2304ee345b05SMike Bayer     have the TypeDecorator embedded into it as the "dialect"
2305ee345b05SMike Bayer     impl, this was probably an unintentional way of achieving
2306ee345b05SMike Bayer     the desired effect.
2307ee345b05SMike Bayer
2308ee345b05SMike Bayer   - TypeDecorator.load_dialect_impl() returns "self.impl" by
2309ee345b05SMike Bayer     default, i.e. not the dialect implementation type of 
2310350aed3fSMike Bayer     "self.impl".   This to support compilation correctly.
2311ee345b05SMike Bayer     Behavior can be user-overridden in exactly the same way 
2312ee345b05SMike Bayer     as before to the same effect.
231379c25edeSMike Bayer
2314350aed3fSMike Bayer   - Added type_coerce(expr, type_) expression element.
231579c25edeSMike Bayer     Treats the given expression as the given type when evaluating
231679c25edeSMike Bayer     expressions and processing result rows, but does not 
231779c25edeSMike Bayer     affect the generation of SQL, other than an anonymous
231879c25edeSMike Bayer     label.
2319350aed3fSMike Bayer
2320611fb771SMike Bayer   - Table.tometadata() now copies Index objects associated
2321611fb771SMike Bayer     with the Table as well.
2322611fb771SMike Bayer
2323611fb771SMike Bayer   - Table.tometadata() issues a warning if the given Table 
2324611fb771SMike Bayer     is already present in the target MetaData - the existing
2325611fb771SMike Bayer     Table object is returned.
2326003149c5SMike Bayer
2327003149c5SMike Bayer   - An informative error message is raised if a Column 
2328003149c5SMike Bayer     which has not yet been assigned a name, i.e. as in 
2329003149c5SMike Bayer     declarative, is used in a context where it is
2330003149c5SMike Bayer     exported to the columns collection of an enclosing
2331003149c5SMike Bayer     select() construct, or if any construct involving
2332003149c5SMike Bayer     that column is compiled before its name is 
2333c5c8cdf3SMike Bayer     assigned.
2334c5c8cdf3SMike Bayer
2335c5c8cdf3SMike Bayer   - as_scalar(), label() can be called on a selectable
2336c5c8cdf3SMike Bayer     which contains a Column that is not yet named.
2337c5c8cdf3SMike Bayer     [ticket:1862]
23384fbd16e0SMike Bayer
2339a4a09a68SMike Bayer   - Fixed recursion overflow which could occur when operating
2340a4a09a68SMike Bayer     with two expressions both of type "NullType", but
2341a4a09a68SMike Bayer     not the singleton NULLTYPE instance. [ticket:1907]
2342350aed3fSMike Bayer
23434fbd16e0SMike Bayer- declarative
2344abc8e45bSMike Bayer   - @classproperty (soon/now @declared_attr) takes effect for 
23454fbd16e0SMike Bayer     __mapper_args__, __table_args__, __tablename__ on 
23464fbd16e0SMike Bayer     a base class that is not a mixin, as well as mixins.
23474fbd16e0SMike Bayer     [ticket:1922]
23481ff666ffSMike Bayer
23491ff666ffSMike Bayer   - @classproperty 's official name/location for usage
2350abc8e45bSMike Bayer     with declarative is sqlalchemy.ext.declarative.declared_attr.
23511ff666ffSMike Bayer     Same thing, but moving there since it is more of a
23521ff666ffSMike Bayer     "marker" that's specific to declararative, 
23531ff666ffSMike Bayer     not just an attribute technique.  [ticket:1915]
2354ec3e6c7dSMike Bayer
2355ec3e6c7dSMike Bayer   - Fixed bug whereby columns on a mixin wouldn't propagate
235683a87b3fSMike Bayer     correctly to a single-table, or joined-table,
235783a87b3fSMike Bayer     inheritance scheme where the attribute name is
235883a87b3fSMike Bayer     different than that of the column. [ticket:1930],
235983a87b3fSMike Bayer     [ticket:1931].
2360c5579f77SMike Bayer
2361c5579f77SMike Bayer   - A mixin can now specify a column that overrides 
2362c5579f77SMike Bayer     a column of the same name associated with a superclass.
2363c5579f77SMike Bayer     Thanks to Oystein Haaland.
2364350aed3fSMike Bayer
236590d4cdbaSMike Bayer- engine
2366350aed3fSMike Bayer
236790d4cdbaSMike Bayer   - Fixed a regression in 0.6.4 whereby the change that
236890d4cdbaSMike Bayer     allowed cursor errors to be raised consistently broke
236990d4cdbaSMike Bayer     the result.lastrowid accessor.   Test coverage has
237090d4cdbaSMike Bayer     been added for result.lastrowid.   Note that lastrowid
237190d4cdbaSMike Bayer     is only supported by Pysqlite and some MySQL drivers,
237290d4cdbaSMike Bayer     so isn't super-useful in the general case.
2373350aed3fSMike Bayer
23740fdd6698SMike Bayer   - the logging message emitted by the engine when
23750fdd6698SMike Bayer     a connection is first used is now "BEGIN (implicit)"