xref: /sqlalchemy/CHANGES (revision 0a092566)
1736bc3bdSMike Bayer- sql:
2e736817aSMike Bayer    - bindparam() names are now repeatable!  specify two
3e736817aSMike Bayer     distinct bindparam()s with the same name in a single statement,
4e736817aSMike Bayer     and the key will be shared.  proper positional/named args translate
5e736817aSMike Bayer     at compile time.  for the old behavior of "aliasing" bind parameters
6e736817aSMike Bayer     with conflicting names, specify "unique=True" - this option is
7e736817aSMike Bayer     still used internally for all the auto-genererated (value-based) 
8e736817aSMike Bayer     bind parameters.    
96a3c374bSMike Bayer
10736bc3bdSMike Bayer    - exists() becomes useable as a standalone selectable, not just in a 
116a3c374bSMike Bayer    WHERE clause, i.e. exists([columns], criterion).select()
126a3c374bSMike Bayer
1341802e10SMike Bayer    - correlated subqueries work inside of ORDER BY, GROUP BY
146a3c374bSMike Bayer
156a3c374bSMike Bayer    - fixed function execution with explicit connections, i.e. 
16ba533798SMike Bayer    conn.execute(func.dosomething())
176a3c374bSMike Bayer
187e2ae824SMike Bayer    - use_labels flag on select() wont auto-create labels for literal text
197e2ae824SMike Bayer      column elements, since we can make no assumptions about the text. to
207e2ae824SMike Bayer      create labels for literal columns, you can say "somecol AS somelabel",
217e2ae824SMike Bayer      or use literal_column("somecol").label("somelabel")
226a3c374bSMike Bayer
237e2ae824SMike Bayer    - quoting wont occur for literal columns when they are "proxied" into the
246a3c374bSMike Bayer    column collection for their selectable (is_literal flag is propigated).
256a3c374bSMike Bayer    literal columns are specified via literal_column("somestring").
266a3c374bSMike Bayer
276a3c374bSMike Bayer    - added "fold_equivalents" boolean argument to Join.select(), which removes
282a778507SMike Bayer    'duplicate' columns from the resulting column clause that are known to be 
292a778507SMike Bayer    equivalent based on the join condition.  this is of great usage when 
302a778507SMike Bayer    constructing subqueries of joins which Postgres complains about if 
3146b82976SMike Bayer    duplicate column names are present.
326a3c374bSMike Bayer
3346b82976SMike Bayer    - fixed use_alter flag on ForeignKeyConstraint [ticket:503]
346a3c374bSMike Bayer
35c7a6d735SMike Bayer    - fixed usage of 2.4-only "reversed" in topological.py [ticket:506]
366a3c374bSMike Bayer
376a3c374bSMike Bayer    - for hackers, refactored the "visitor" system of ClauseElement and
386a3c374bSMike Bayer    SchemaItem so that the traversal of items is controlled by the 
396a3c374bSMike Bayer    ClauseVisitor itself, using the method visitor.traverse(item).
406a3c374bSMike Bayer    accept_visitor() methods can still be called directly but will
416a3c374bSMike Bayer    not do any traversal of child items.  ClauseElement/SchemaItem now 
426a3c374bSMike Bayer    have a configurable get_children() method to return the collection
436a3c374bSMike Bayer    of child elements for each parent object. This allows the full
446a3c374bSMike Bayer    traversal of items to be clear and unambiguous (as well as loggable),
456a3c374bSMike Bayer    with an easy method of limiting a traversal (just pass flags which
466a3c374bSMike Bayer    are picked up by appropriate get_children() methods). [ticket:501]
476a3c374bSMike Bayer
48bfbbb2afSRick Morrison    - the "else_" parameter to the case statement now properly works when
49bfbbb2afSRick Morrison    set to zero.
50bfbbb2afSRick Morrison
5130b20e3cSRick Morrison
52320cb9b7SMike Bayer- oracle:
53320cb9b7SMike Bayer    - got binary working for any size input !  cx_oracle works fine,
54320cb9b7SMike Bayer      it was my fault as BINARY was being passed and not BLOB for
55320cb9b7SMike Bayer      setinputsizes (also unit tests werent even setting input sizes).
566a3c374bSMike Bayer
57320cb9b7SMike Bayer    - auto_setinputsizes defaults to True for Oracle, fixed cases where
58320cb9b7SMike Bayer      it improperly propigated bad types.
596a3c374bSMike Bayer
60e5f16ff2SMike Bayer- mysql:
61e5f16ff2SMike Bayer    - added a catchall **kwargs to MSString, to help reflection of 
62e5f16ff2SMike Bayer      obscure types (like "varchar() binary" in MS 4.0)
63e5f16ff2SMike Bayer
64f0b72859SMike Bayer- orm:
65b2e04755SMike Bayer    - the full featureset of the SelectResults extension has been merged
66b2e04755SMike Bayer      into a new set of methods available off of Query.  These methods
67b2e04755SMike Bayer      all provide "generative" behavior, whereby the Query is copied
68b2e04755SMike Bayer      and a new one returned with additional criterion added.  
69b2e04755SMike Bayer      The new methods include:
70b2e04755SMike Bayer
71b2e04755SMike Bayer          filter() - applies select criterion to the query
72b2e04755SMike Bayer          filter_by() - applies "by"-style criterion to the query
73b2e04755SMike Bayer          avg() - return the avg() function on the given column
74b2e04755SMike Bayer          join() - join to a property (or across a list of properties)
75b2e04755SMike Bayer          outerjoin() - like join() but uses LEFT OUTER JOIN
76b2e04755SMike Bayer          limit()/offset() - apply LIMIT/OFFSET
77b2e04755SMike Bayer          range-based access which applies limit/offset:  
78b2e04755SMike Bayer             session.query(Foo)[3:5]
79b2e04755SMike Bayer          distinct() - apply DISTINCT
80b2e04755SMike Bayer          list() - evaluate the criterion and return results
81b2e04755SMike Bayer          
82b2e04755SMike Bayer      no incompatible changes have been made to Query's API and no methods
83b2e04755SMike Bayer      have been deprecated.  Existing methods like select(), select_by(),
84b2e04755SMike Bayer      get(), get_by() all execute the query at once and return results
85b2e04755SMike Bayer      like they always did.  join_to()/join_via() are still there although
86b2e04755SMike Bayer      the generative join()/outerjoin() methods are easier to use.
87b2e04755SMike Bayer      
88b2e04755SMike Bayer    - the return value for multiple mappers used with instances() now returns
89b2e04755SMike Bayer      a cartesian product of the requested list of mappers, represented
90b2e04755SMike Bayer      as a list of tuples.  this corresponds to the documented behavior.
91b2e04755SMike Bayer      So that instances match up properly, the "uniquing" is disabled when 
92b2e04755SMike Bayer      this feature is used.
936a3c374bSMike Bayer
94dc2d085aSMike Bayer    - Query has add_entity() and add_column() generative methods.  these
95dc2d085aSMike Bayer      will add the given mapper/class or ColumnElement to the query at compile
966a3c374bSMike Bayer      time, and apply them to the instances() method.  the user is responsible
97dc2d085aSMike Bayer      for constructing reasonable join conditions (otherwise you can get
98dc2d085aSMike Bayer      full cartesian products).  result set is the list of tuples, non-uniqued.
996a3c374bSMike Bayer
100a5bf2571SMike Bayer    - eager loading will not "aliasize" "order by" clauses that were placed 
101a5bf2571SMike Bayer      in the select statement by something other than the eager loader
102a5bf2571SMike Bayer      itself, to fix possibility of dupe columns as illustrated in
103a5bf2571SMike Bayer      [ticket:495].  however, this means you have to be more careful with
104a5bf2571SMike Bayer      the columns placed in the "order by" of Query.select(), that you have
105a5bf2571SMike Bayer      explicitly named them in your criterion (i.e. you cant rely on the
106a5bf2571SMike Bayer      eager loader adding them in for you)
107a5bf2571SMike Bayer      
108b2e04755SMike Bayer    - strings and columns can also be sent to the *args of instances() where
109b2e04755SMike Bayer      those exact result columns will be part of the result tuples.
1106a3c374bSMike Bayer
111f0b72859SMike Bayer    - a full select() construct can be passed to query.select() (which
112f0b72859SMike Bayer      worked anyway), but also query.selectfirst(), query.selectone() which
113f0b72859SMike Bayer      will be used as is (i.e. no query is compiled). works similarly to
114f0b72859SMike Bayer      sending the results to instances().
115485fb57fSMike Bayer
116485fb57fSMike Bayer    - added a handy multi-use "identity_key()" method to Session, allowing
117485fb57fSMike Bayer      the generation of identity keys for primary key values, instances,
118485fb57fSMike Bayer      and rows, courtesy Daniel Miller
1196a3c374bSMike Bayer      
1206a3c374bSMike Bayer    - added "refresh-expire" cascade [ticket:492].  allows refresh() and
1216a3c374bSMike Bayer      expire() calls to propigate along relationships.
1226a3c374bSMike Bayer    
1238fa3becdSMike Bayer    - more fixes to polymorphic relations, involving proper lazy-clause
1248fa3becdSMike Bayer      generation on many-to-one relationships to polymorphic mappers 
1259154e1efSMike Bayer      [ticket:493]. also fixes to detection of "direction", more specific
1269154e1efSMike Bayer      targeting of columns that belong to the polymorphic union vs. those
1279154e1efSMike Bayer      that dont.
1288f788f68SMike Bayer      
1298f788f68SMike Bayer    - some fixes to relationship calcs when using "view_only=True" to pull
1308f788f68SMike Bayer      in other tables into the join condition which arent parent of the
1318f788f68SMike Bayer      relationship's parent/child mappings
1326a3c374bSMike Bayer
133037ee9fbSMike Bayer    - flush fixes on self-referential relationships that contain references
134037ee9fbSMike Bayer      to other instances outside of the cyclical chain, when the initial
135037ee9fbSMike Bayer      self-referential objects are not actually part of the flush
136037ee9fbSMike Bayer      
1377693a680SMike Bayer    - put an aggressive check for "flushing object A with a collection
1387693a680SMike Bayer      of B's, but you put a C in the collection" error condition - 
1397693a680SMike Bayer      **even if C is a subclass of B**, unless B's mapper loads polymorphically.
1407693a680SMike Bayer      Otherwise, the collection will later load a "B" which should be a "C"
1417693a680SMike Bayer      (since its not polymorphic) which breaks in bi-directional relationships
1427693a680SMike Bayer      (i.e. C has its A, but A's backref will lazyload it as a different 
1437693a680SMike Bayer      instance of type "B") [ticket:500]
1446a3c374bSMike Bayer      This check is going to bite some of you who do this without issues, 
1456a3c374bSMike Bayer      so the error message will also document a flag "enable_typechecks=False" 
1466a3c374bSMike Bayer      to disable this checking.  But be aware that bi-directional relationships
1476a3c374bSMike Bayer      in particular become fragile without this check.
1486a3c374bSMike Bayer
149231acabfSMike Bayer- extensions:
1506a3c374bSMike Bayer
151231acabfSMike Bayer    - options() method on SelectResults now implemented "generatively"
1526a3c374bSMike Bayer      like the rest of the SelectResults methods [ticket:472].  But
1536a3c374bSMike Bayer      you're going to just use Query now anyway.
1546a3c374bSMike Bayer
155b2e04755SMike Bayer    - query() method is added by assignmapper.  this helps with 
156b2e04755SMike Bayer      navigating to all the new generative methods on Query.
15730b20e3cSRick Morrison
15830b20e3cSRick Morrison- ms-sql:
15930b20e3cSRick Morrison    - removed seconds input on DATE column types (probably 
16030b20e3cSRick Morrison        should remove the time altogether)
16130b20e3cSRick Morrison
16230b20e3cSRick Morrison    - null values in float fields no longer raise errors
16330b20e3cSRick Morrison
16430b20e3cSRick Morrison    - LIMIT with OFFSET now raises an error (MS-SQL has no OFFSET support)
16530b20e3cSRick Morrison
1661201de2eSRick Morrison    - added an facility to use the MSSQL type VARCHAR(max) instead of TEXT 
1671201de2eSRick Morrison      for large unsized string fields. Use the new "text_as_varchar" to 
1681201de2eSRick Morrison      turn it on. [ticket:509]
1691201de2eSRick Morrison
1700a092566SRick Morrison    - ORDER BY clauses without a LIMIT are now stripped in subqueries, as 
1710a092566SRick Morrison      MS-SQL forbids this usage
1720a092566SRick Morrison
1731c561422SRick Morrison    - cleanup of module importing code; specifiable DB-API module; more 
1741c561422SRick Morrison      explicit ordering of module preferences. [ticket:480]
1751c561422SRick Morrison
1761201de2eSRick Morrison
17730b20e3cSRick Morrison
178b2e04755SMike Bayer    
179385fa47dSMike Bayer0.3.5
180ac4b2a8dSMike Bayer- sql:
181f803cbc6SMike Bayer    - the value of "case_sensitive" defaults to True now, regardless of the
182f803cbc6SMike Bayer      casing of the identifier, unless specifically set to False. this is
183f803cbc6SMike Bayer      because the object might be label'ed as something else which does
184f803cbc6SMike Bayer      contain mixed case, and propigating "case_sensitive=False" breaks that.
185f803cbc6SMike Bayer      Other fixes to quoting when using labels and "fake" column objects
186f803cbc6SMike Bayer    - added a "supports_execution()" method to ClauseElement, so that
187f803cbc6SMike Bayer      individual kinds of clauses can express if they are appropriate for
188f803cbc6SMike Bayer      executing...such as, you can execute a "select", but not a "Table" or a
189f803cbc6SMike Bayer      "Join".
190f803cbc6SMike Bayer    - fixed argument passing to straight textual execute() on engine,
191f803cbc6SMike Bayer      connection. can handle *args or a list instance for positional, **kwargs
192f803cbc6SMike Bayer      or a dict instance for named args, or a list of list or dicts to invoke
193f803cbc6SMike Bayer      executemany()
194f803cbc6SMike Bayer    - small fix to BoundMetaData to accept unicode or string URLs
195f803cbc6SMike Bayer    - fixed named PrimaryKeyConstraint generation [ticket:466] courtesy
196f803cbc6SMike Bayer      andrija at gmail
197f803cbc6SMike Bayer    - fixed generation of CHECK constraints on columns [ticket:464]
198f803cbc6SMike Bayer    - fixes to tometadata() operation to propigate Constraints at column and
199f803cbc6SMike Bayer      table level
200385fa47dSMike Bayer- oracle:
201f803cbc6SMike Bayer    - when returning "rowid" as the ORDER BY column or in use with ROW_NUMBER
202f803cbc6SMike Bayer      OVER, oracle dialect checks the selectable its being applied to and will
203f803cbc6SMike Bayer      switch to table PK if not applicable, i.e. for a UNION. checking for
204f803cbc6SMike Bayer      DISTINCT, GROUP BY (other places that rowid is invalid) still a TODO.
205f803cbc6SMike Bayer      allows polymorphic mappings to function, [ticket:436]
206f803cbc6SMike Bayer    - sequences on a non-pk column will properly fire off on INSERT
207f803cbc6SMike Bayer    - added PrefetchingResultProxy support to pre-fetch LOB columns when they
208f803cbc6SMike Bayer      are known to be present, fixes [ticket:435]
209f803cbc6SMike Bayer    - implemented reflection of tables based on synonyms, including across
210f803cbc6SMike Bayer      dblinks [ticket:379]
211f803cbc6SMike Bayer    - issues a log warning when a related table cant be reflected due to
212f803cbc6SMike Bayer      certain permission errors [ticket:363]
21307ef7121SMike Bayer- mysql:
214f803cbc6SMike Bayer    - fix to reflection on older DB's that might return array() type for 
215f803cbc6SMike Bayer    "show variables like" statements
2168d45eb6aSMike Bayer- postgres:
217f803cbc6SMike Bayer    - better reflection of sequences for alternate-schema Tables [ticket:442]
218f803cbc6SMike Bayer    - sequences on a non-pk column will properly fire off on INSERT
219f803cbc6SMike Bayer    - added PGInterval type [ticket:460], PGInet type [ticket:444]
2206fac73b6SRick Morrison- mssql:
221f803cbc6SMike Bayer    - preliminary support for pyodbc (Yay!) [ticket:419]
222f803cbc6SMike Bayer    - better support for NVARCHAR types added [ticket:298]
223f803cbc6SMike Bayer    - fix for commit logic on pymssql
224f803cbc6SMike Bayer    - fix for query.get() with schema [ticket:456]
225f803cbc6SMike Bayer    - fix for non-integer relationships [ticket:473]
226f803cbc6SMike Bayer    - DB-API module now selectable at run-time [ticket:419]
227f803cbc6SMike Bayer    - now passes many more unit tests [tickets:422, 481, 415]
228f803cbc6SMike Bayer    - better unittest compatibility with ANSI functions [ticket:479]
229f803cbc6SMike Bayer    - improved support for implicit sequence PK columns with auto-insert
230f803cbc6SMike Bayer      [ticket:415]
231f803cbc6SMike Bayer    - fix for blank password in adodbapi [ticket:371]
232f803cbc6SMike Bayer    - fixes to get unit tests working with pyodbc [ticket:481]
233f803cbc6SMike Bayer    - fix to auto_identity_insert on db-url query
234f803cbc6SMike Bayer    - added query_timeout to db-url query parms. currently works only for
235f803cbc6SMike Bayer      pymssql
236f803cbc6SMike Bayer    - tested with pymssql 0.8.0 (which is now LGPL)
237f803cbc6SMike Bayer- orm bugs:
238f803cbc6SMike Bayer    - another refactoring to relationship calculation. Allows more accurate
239f803cbc6SMike Bayer      ORM behavior with relationships from/to/between mappers, particularly
240f803cbc6SMike Bayer      polymorphic mappers, also their usage with Query, SelectResults. tickets
241f803cbc6SMike Bayer      include [ticket:439], [ticket:441], [ticket:448].
24267baacf0SMike Bayer    - removed deprecated method of specifying custom collections on classes;
24367baacf0SMike Bayer      you must now use the "collection_class" option. the old way was
24467baacf0SMike Bayer      beginning to produce conflicts when people used assign_mapper(), which
24567baacf0SMike Bayer      now patches an "options" method, in conjunction with a relationship
24667baacf0SMike Bayer      named "options". (relationships take precedence over monkeypatched
24767baacf0SMike Bayer      assign_mapper methods).
248f803cbc6SMike Bayer    - extension() query option propigates to Mapper._instance() method so that
249f803cbc6SMike Bayer      all loading-related methods get called [ticket:454]
250f803cbc6SMike Bayer    - eager relation to an inheriting mapper wont fail if no rows returned for
251f803cbc6SMike Bayer      the relationship.
252f803cbc6SMike Bayer    - eager relation loading bug fixed for eager relation on multiple
253f803cbc6SMike Bayer      descendant classes [ticket:486]
254f803cbc6SMike Bayer    - fix for very large topological sorts, courtesy ants.aasma at gmail
255f803cbc6SMike Bayer      [ticket:423]
256f803cbc6SMike Bayer    - eager loading is slightly more strict about detecting "self-referential"
257f803cbc6SMike Bayer      relationships, specifically between polymorphic mappers. this results in
258f803cbc6SMike Bayer      an "eager degrade" to lazy loading.
259f803cbc6SMike Bayer    - improved support for complex queries embedded into "where" criterion for
260f803cbc6SMike Bayer      query.select() [ticket:449]
261f803cbc6SMike Bayer    - mapper options like eagerload(), lazyload(), deferred(), will work for
262f803cbc6SMike Bayer      "synonym()" relationships [ticket:485]
263f803cbc6SMike Bayer    - fixed bug where cascade operations incorrectly included deleted
264f803cbc6SMike Bayer      collection items in the cascade [ticket:445]
265f803cbc6SMike Bayer    - fixed relationship deletion error when one-to-many child item is moved
266f803cbc6SMike Bayer      to a new parent in a single unit of work [ticket:478]
267f803cbc6SMike Bayer    - fixed relationship deletion error where parent/child with a single
268f803cbc6SMike Bayer      column as PK/FK on the child would raise a "blank out the primary key"
269f803cbc6SMike Bayer      error, if manually deleted or "delete" cascade without "delete-orphan"
270f803cbc6SMike Bayer      was used
271f803cbc6SMike Bayer    - fix to deferred so that load operation doesnt mistakenly occur when only
272f803cbc6SMike Bayer      PK col attributes are set
273f803cbc6SMike Bayer- orm enhancements:
274f803cbc6SMike Bayer    - implemented foreign_keys argument to mapper [ticket:385]. use in
275f803cbc6SMike Bayer      conjunction with primaryjoin/secondaryjoin arguments to specify/override
276f803cbc6SMike Bayer      foreign keys defined on the Table instance.
277f803cbc6SMike Bayer    - contains_eager('foo') automatically implies eagerload('foo')
278f803cbc6SMike Bayer    - added "alias" argument to contains_eager(). use it to specify the string
279f803cbc6SMike Bayer      name or Alias instance of an alias used in the query for the eagerly
280f803cbc6SMike Bayer      loaded child items. easier to use than "decorator"
281f803cbc6SMike Bayer    - added "contains_alias()" option for result set mapping to an alias of
282f803cbc6SMike Bayer      the mapped table
283f803cbc6SMike Bayer    - added support for py2.5 "with" statement with SessionTransaction
284f803cbc6SMike Bayer      [ticket:468]
285f803cbc6SMike Bayer- extensions:
286f803cbc6SMike Bayer    - added distinct() method to SelectResults. generally should only make a
287f803cbc6SMike Bayer      difference when using count().
288f803cbc6SMike Bayer    - added options() method to SelectResults, equivalent to query.options()
289f803cbc6SMike Bayer      [ticket:472]
290f803cbc6SMike Bayer    - added optional __table_opts__ dictionary to ActiveMapper, will send kw
291f803cbc6SMike Bayer      options to Table objects [ticket:462]
292275640dcSMike Bayer    - added selectfirst(), selectfirst_by() to assign_mapper [ticket:467]
293e7ac502bSRick Morrison
2941a5ba210SMike Bayer0.3.4
2951a5ba210SMike Bayer- general:
2962a7a5525SMike Bayer  - global "insure"->"ensure" change. in US english "insure" is actually
2972a7a5525SMike Bayer    largely interchangeable with "ensure" (so says the dictionary), so I'm not
2982a7a5525SMike Bayer    completely illiterate, but its definitely sub-optimal to "ensure" which is
2992a7a5525SMike Bayer    non-ambiguous.
3001a5ba210SMike Bayer- sql:
3014e7c3d50SMike Bayer  - added "fetchmany()" support to ResultProxy
3022a7a5525SMike Bayer  - added support for column "key" attribute to be useable in
3032a7a5525SMike Bayer    row[<key>]/row.<key>
3042a7a5525SMike Bayer  - changed "BooleanExpression" to subclass from "BinaryExpression", so that
3052a7a5525SMike Bayer    boolean expressions can also follow column-clause behaviors (i.e. label(),
3062a7a5525SMike Bayer    etc).
307fe0cf718SMike Bayer  - trailing underscores are trimmed from func.<xxx> calls, such as func.if_()
3082a7a5525SMike Bayer  - fix to correlation of subqueries when the column list of the select
3092a7a5525SMike Bayer    statement is constructed with individual calls to append_column(); this
3102a7a5525SMike Bayer    fixes an ORM bug whereby nested select statements were not getting
3112a7a5525SMike Bayer    correlated with the main select generated by the Query object.
3122a7a5525SMike Bayer  - another fix to subquery correlation so that a subquery which has only one
3132a7a5525SMike Bayer    FROM element will *not* correlate that single element, since at least one
3142a7a5525SMike Bayer    FROM element is required in a query.
3152a7a5525SMike Bayer  - default "timezone" setting is now False. this corresponds to Python's
3162a7a5525SMike Bayer    datetime behavior as well as Postgres' timestamp/time types (which is the
3172a7a5525SMike Bayer    only timezone-sensitive dialect at the moment) [ticket:414]
3182a7a5525SMike Bayer  - the "op()" function is now treated as an "operation", rather than a
3192a7a5525SMike Bayer    "comparison". the difference is, an operation produces a BinaryExpression
3202a7a5525SMike Bayer    from which further operations can occur whereas comparison produces the
3212a7a5525SMike Bayer    more restrictive BooleanExpression
3222a7a5525SMike Bayer  - trying to redefine a reflected primary key column as non-primary key raises
3232a7a5525SMike Bayer    an error
3242a7a5525SMike Bayer  - type system slightly modified to support TypeDecorators that can be
3252a7a5525SMike Bayer    overridden by the dialect (ok, thats not very clear, it allows the mssql
3262a7a5525SMike Bayer    tweak below to be possible)
327437f1ce6SMike Bayer- mssql:
3282a7a5525SMike Bayer  - added an NVarchar type (produces NVARCHAR), also MSUnicode which provides
3292a7a5525SMike Bayer    Unicode-translation for the NVarchar regardless of dialect convert_unicode
3302a7a5525SMike Bayer    setting.
331437f1ce6SMike Bayer- postgres:
3322a7a5525SMike Bayer  - fix to the initial checkfirst for tables to take current schema into
3332a7a5525SMike Bayer    account [ticket:424]
334437f1ce6SMike Bayer  - postgres has an optional "server_side_cursors=True" flag which will utilize
3352a7a5525SMike Bayer    server side cursors. these are appropriate for fetching only partial
3362a7a5525SMike Bayer    results and are necessary for working with very large unbounded result
3372a7a5525SMike Bayer    sets. While we'd like this to be the default behavior, different
3382a7a5525SMike Bayer    environments seem to have different results and the causes have not been
3392a7a5525SMike Bayer    isolated so we are leaving the feature off by default for now. Uses an
3402a7a5525SMike Bayer    apparently undocumented psycopg2 behavior recently discovered on the
3412a7a5525SMike Bayer    psycopg mailing list.
3422a7a5525SMike Bayer  - added "BIGSERIAL" support for postgres table with
3432a7a5525SMike Bayer    PGBigInteger/autoincrement
3442a7a5525SMike Bayer  - fixes to postgres reflection to better handle when schema names are
3452a7a5525SMike Bayer    present; thanks to jason (at) ncsmags.com [ticket:402]
346437f1ce6SMike Bayer- mysql:
3472a7a5525SMike Bayer  - mysql is inconsistent with what kinds of quotes it uses in foreign keys
3482a7a5525SMike Bayer    during a SHOW CREATE TABLE, reflection updated to accomodate for all three
3492a7a5525SMike Bayer    styles [ticket:420]
3502a7a5525SMike Bayer  - mysql table create options work on a generic passthru now, i.e. Table(...,
3512a7a5525SMike Bayer    mysql_engine='InnoDB', mysql_collate="latin1_german2_ci",
3522a7a5525SMike Bayer    mysql_auto_increment="5", mysql_<somearg>...), helps [ticket:418]
3531a5ba210SMike Bayer- firebird:
3542a7a5525SMike Bayer  - order of constraint creation puts primary key first before all other
3552a7a5525SMike Bayer    constraints; required for firebird, not a bad idea for others [ticket:408]
3561a5ba210SMike Bayer  - Firebird fix to autoload multifield foreign keys [ticket:409]
3572a7a5525SMike Bayer  - Firebird NUMERIC type properly handles a type without precision
3582a7a5525SMike Bayer    [ticket:409]
359b8662333SMike Bayer- oracle:
3602a7a5525SMike Bayer  - *slight* support for binary, but still need to figure out how to insert
3612a7a5525SMike Bayer    reasonably large values (over 4K). requires auto_setinputsizes=True sent to
3622a7a5525SMike Bayer    create_engine(), rows must be fully fetched individually, etc.
3631a5ba210SMike Bayer- orm:
3642a7a5525SMike Bayer  - poked the first hole in the can of worms: saying
3652a7a5525SMike Bayer    query.select_by(somerelationname=someinstance) will create the join of the
3662a7a5525SMike Bayer    primary key columns represented by "somerelationname"'s mapper to the
3672a7a5525SMike Bayer    actual primary key in "someinstance".
3682a7a5525SMike Bayer  - reworked how relations interact with "polymorphic" mappers, i.e. mappers
3692a7a5525SMike Bayer    that have a select_table as well as polymorphic flags. better determination
3702a7a5525SMike Bayer    of proper join conditions, interaction with user- defined join conditions,
3712a7a5525SMike Bayer    and support for self-referential polymorphic mappers.
3722a7a5525SMike Bayer  - related to polymorphic mapping relations, some deeper error checking when
3732a7a5525SMike Bayer    compiling relations, to detect an ambiguous "primaryjoin" in the case that
3742a7a5525SMike Bayer    both sides of the relationship have foreign key references in the primary
3752a7a5525SMike Bayer    join condition. also tightened down conditions used to locate "relation
3762a7a5525SMike Bayer    direction", associating the "foreignkey" of the relationship with the
3772a7a5525SMike Bayer    "primaryjoin"
3782a7a5525SMike Bayer  - a little bit of improvement to the concept of a "concrete" inheritance
3792a7a5525SMike Bayer    mapping, though that concept is not well fleshed out yet (added test case
3802a7a5525SMike Bayer    to support concrete mappers on top of a polymorphic base).
381e7f428e9SMike Bayer  - fix to "proxy=True" behavior on synonym()
3822a7a5525SMike Bayer  - fixed bug where delete-orphan basically didn't work with many-to-many
3832a7a5525SMike Bayer    relationships [ticket:427], backref presence generally hid the symptom
3842a7a5525SMike Bayer  - added a mutex to the mapper compilation step. ive been reluctant to add any
3852a7a5525SMike Bayer    kind of threading anything to SA but this is one spot that its its really
3862a7a5525SMike Bayer    needed since mappers are typically "global", and while their state does not
3872a7a5525SMike Bayer    change during normal operation, the initial compilation step does modify
3882a7a5525SMike Bayer    internal state significantly, and this step usually occurs not at
3892a7a5525SMike Bayer    module-level initialization time (unless you call compile()) but at
3902a7a5525SMike Bayer    first-request time
3915b4871f4SMike Bayer  - basic idea of "session.merge()" actually implemented.  needs more testing.
3921a5ba210SMike Bayer  - added "compile_mappers()" function as a shortcut to compiling all mappers
3932a7a5525SMike Bayer  - fix to MapperExtension create_instance so that entity_name properly
3942a7a5525SMike Bayer    associated with new instance
3951a5ba210SMike Bayer  - speed enhancements to ORM object instantiation, eager loading of rows
3962a7a5525SMike Bayer  - invalid options sent to 'cascade' string will raise an exception
3972a7a5525SMike Bayer    [ticket:406]
3982a7a5525SMike Bayer  - fixed bug in mapper refresh/expire whereby eager loaders didnt properly
3992a7a5525SMike Bayer    re-populate item lists [ticket:407]
4002a7a5525SMike Bayer  - fix to post_update to ensure rows are updated even for non insert/delete
4012a7a5525SMike Bayer    scenarios [ticket:413]
4022a7a5525SMike Bayer  - added an error message if you actually try to modify primary key values on
4032a7a5525SMike Bayer    an entity and then flush it [ticket:412]
4047838cb17SMike Bayer- extensions
4052a7a5525SMike Bayer  - added "validate=False" argument to assign_mapper, if True will insure that
4062a7a5525SMike Bayer    only mapped attributes are named [ticket:426]
4072a7a5525SMike Bayer  - assign_mapper gets "options", "instances" functions added (i.e.
4082a7a5525SMike Bayer    MyClass.instances())
4092a7a5525SMike Bayer
410f5b5696aSMike Bayer0.3.3
4117f6dc880SMike Bayer- string-based FROM clauses fixed, i.e. select(..., from_obj=["sometext"])
41251ece86cSMike Bayer- fixes to passive_deletes flag, lazy=None (noload) flag
41351ece86cSMike Bayer- added example/docs for dealing with large collections
41451ece86cSMike Bayer- added object_session() method to sqlalchemy namespace
4158061aaaeSMike Bayer- fixed QueuePool bug whereby its better able to reconnect to a database
4168061aaaeSMike Bayerthat was not reachable (thanks to Sébastien Lelong), also fixed dispose()
4178061aaaeSMike Bayermethod
418e1a52eb7SMike Bayer- patch that makes MySQL rowcount work correctly! [ticket:396]
419ca4fc24cSMike Bayer- fix to MySQL catch of 2006/2014 errors to properly re-raise OperationalError
420ca4fc24cSMike Bayerexception
421f5b5696aSMike Bayer
42219fcb943SMike Bayer0.3.2
4231ed9d0bcSMike Bayer- major connection pool bug fixed.  fixes MySQL out of sync
4241ed9d0bcSMike Bayererrors, will also prevent transactions getting rolled back
425f279e2b1SMike Bayeraccidentally in all DBs [ticket:387]
426f279e2b1SMike Bayer- major speed enhancements vs. 0.3.1, to bring speed
427f279e2b1SMike Bayerback to 0.2.8 levels 
42876772de1SMike Bayer  - made conditional dozens of debug log calls that were 
42976772de1SMike Bayer  time-intensive to generate log messages
43076772de1SMike Bayer  - fixed bug in cascade rules whereby the entire object graph
43176772de1SMike Bayer  could be unnecessarily cascaded on the save/update cascade
432f279e2b1SMike Bayer  - various speedups in attributes module
4333d45d219SMike Bayer- identity map in Session is by default *no longer weak referencing*.
4343d45d219SMike Bayerto have it be weak referencing, use create_session(weak_identity_map=True)
4350dff7f4eSMike Bayerfixes [ticket:388]
436c6538b6bSMike Bayer- MySQL detects errors 2006 (server has gone away) and 2014
437c6538b6bSMike Bayer(commands out of sync) and invalidates the connection on which it occured.
438f3720727SMike Bayer- MySQL bool type fix: [ticket:307]
439d56a50ebSMike Bayer- postgres reflection fixes: [ticket:349] [ticket:382]
44019fcb943SMike Bayer- added keywords for EXCEPT, INTERSECT, EXCEPT ALL, INTERSECT ALL
44119fcb943SMike Bayer[ticket:247]
442ccee96f1SMike Bayer- assign_mapper in assignmapper extension returns the created mapper
443ccee96f1SMike Bayer[changeset:2110]
44495dc2159SMike Bayer- added label() function to Select class, when scalar=True is used
4450dff7f4eSMike Bayerto create a scalar subquery 
4460dff7f4eSMike Bayeri.e. "select x, y, (select max(foo) from table) AS foomax from table"
447f279e2b1SMike Bayer- added onupdate and ondelete keyword arguments to ForeignKey; propigate
448f279e2b1SMike Bayerto underlying ForeignKeyConstraint if present.  (dont propigate in the
449f279e2b1SMike Bayerother direction, however)
4506bba73a9SMike Bayer- fix to session.update() to preserve "dirty" status of incoming object
4510dff7f4eSMike Bayer- sending a selectable to an IN via the in_() function no longer creates 
4520dff7f4eSMike Bayera "union" out of multiple selects; only one selectable to a the in_() function
4530dff7f4eSMike Bayeris allowed now (make a union yourself if union is needed)
454117d6eb5SMike Bayer- improved support for disabling save-update cascade via cascade="none" etc.
455a97a1fcaSMike Bayer- added "remote_side" argument to relation(), used only with self-referential
456a97a1fcaSMike Bayermappers to force the direction of the parent/child relationship.  replaces
457f279e2b1SMike Bayerthe usage of the "foreignkey" parameter for "switching" the direction.
458f279e2b1SMike Bayer"foreignkey" argument is deprecated for all uses and will eventually
4590dff7f4eSMike Bayerbe replaced by an argument dedicated to ForeignKey specification on mappers.
460a97a1fcaSMike Bayer
46187cda86fSMike Bayer0.3.1
462cb8737e6SMike Bayer- Engine/Pool:
463cb8737e6SMike Bayer  - some new Pool utility classes, updated docs
464cb8737e6SMike Bayer  - "use_threadlocal" on Pool defaults to False (same as create_engine)
465cb8737e6SMike Bayer  - fixed direct execution of Compiled objects
466cb8737e6SMike Bayer  - create_engine() reworked to be strict about incoming **kwargs.  all keyword
467cb8737e6SMike Bayerarguments must be consumed by one of the dialect, connection pool, and engine
468cb8737e6SMike Bayerconstructors, else a TypeError is thrown which describes the full set of
469cb8737e6SMike Bayerinvalid kwargs in relation to the selected dialect/pool/engine configuration.
470cb8737e6SMike Bayer- Databases/Types:
471cb8737e6SMike Bayer  - MySQL catches exception on "describe" and reports as NoSuchTableError
472cb8737e6SMike Bayer  - further fixes to sqlite booleans, weren't working as defaults
473cb8737e6SMike Bayer  - fix to postgres sequence quoting when using schemas
474cb8737e6SMike Bayer- ORM:
475cb8737e6SMike Bayer  - the "delete" cascade will load in all child objects, if they were not
476b7d1d6deSMike Bayerloaded already.  this can be turned off (i.e. the old behavior) by setting 
477b7d1d6deSMike Bayerpassive_deletes=True on a relation().
478cb8737e6SMike Bayer  - adjustments to reworked eager query generation to not fail on circular
479cb8737e6SMike Bayereager-loaded relationships (like backrefs)
480cb8737e6SMike Bayer  - fixed bug where eagerload() (nor lazyload()) option didn't properly
48116b8f5f5SMike Bayerinstruct the Query whether or not to use "nesting" when producing a
48216b8f5f5SMike BayerLIMIT query.
483cb8737e6SMike Bayer  - fixed bug in circular dependency sorting at flush time; if object A
484ed33944fSMike Bayercontained a cyclical many-to-one relationship to object B, and object B 
485ed33944fSMike Bayerwas just attached to object A, *but* object B itself wasnt changed,
486ed33944fSMike Bayerthe many-to-one synchronize of B's primary key attribute to A's foreign key
487ed33944fSMike Bayerattribute wouldnt occur.  [ticket:360]
488cb8737e6SMike Bayer  - implemented from_obj argument for query.count, improves count function
489aeb8c429SMike Bayeron selectresults [ticket:325]
490cb8737e6SMike Bayer  - added an assertion within the "cascade" step of ORM relationships to check
491695f65dbSMike Bayerthat the class of object attached to a parent object is appropriate
492695f65dbSMike Bayer(i.e. if A.items stores B objects, raise an error if a C is appended to A.items)
493cb8737e6SMike Bayer  - new extension sqlalchemy.ext.associationproxy, provides transparent 
494cb8737e6SMike Bayer"association object" mappings.  new example 
495cb8737e6SMike Bayerexamples/association/proxied_association.py illustrates.
496cb8737e6SMike Bayer  - improvement to single table inheritance to load full hierarchies beneath 
49703068225SMike Bayerthe target class
498cb8737e6SMike Bayer  - fix to subtle condition in topological sort where a node could appear twice,
499ef48ddc5SMike Bayerfor [ticket:362]
500cb8737e6SMike Bayer  - additional rework to topological sort, refactoring, for [ticket:365]
501cb8737e6SMike Bayer  - "delete-orphan" for a certain type can be set on more than one parent class;
5024cbbf772SMike Bayerthe instance is an "orphan" only if its not attached to *any* of those parents
50387cda86fSMike Bayer
5044c235340SMike Bayer0.3.0
5057242a617SMike Bayer- General:
5067242a617SMike Bayer    - logging is now implemented via standard python "logging" module.
5077242a617SMike Bayer    "echo" keyword parameters are still functional but set/unset
5087242a617SMike Bayer    log levels for their respective classes/instances.  all logging
5097242a617SMike Bayer    can be controlled directly through the Python API by setting
5107242a617SMike Bayer    INFO and DEBUG levels for loggers in the "sqlalchemy" namespace.
5117242a617SMike Bayer    class-level logging is under "sqlalchemy.<module>.<classname>",
5124c235340SMike Bayer    instance-level logging under "sqlalchemy.<module>.<classname>.0x..<00-FF>".
5137242a617SMike Bayer    Test suite includes "--log-info" and "--log-debug" arguments
5147242a617SMike Bayer    which work independently of --verbose/--quiet.  Logging added
5157242a617SMike Bayer    to orm to allow tracking of mapper configurations, row iteration.
5168657f3bbSMike Bayer    - the documentation-generation system has been overhauled to be
5178657f3bbSMike Bayer    much simpler in design and more integrated with Markdown
5187242a617SMike Bayer- Specific Databases:
5197242a617SMike Bayer    - SQLite:
5207242a617SMike Bayer    - sqlite boolean datatype converts False/True to 0/1 by default
521e16bfad4SMike Bayer    - fixes to Date/Time (SLDate/SLTime) types; works as good as postgres 
522e16bfad4SMike Bayer    now [ticket:335]
5237242a617SMike Bayer    - MS-SQL: 
5247242a617SMike Bayer    - fixes bug 261 (table reflection broken for MS-SQL case-sensitive 
5257242a617SMike Bayer    databases)
5267242a617SMike Bayer    - can now specify port for pymssql
5277242a617SMike Bayer    - introduces new "auto_identity_insert" option for auto-switching 
5287242a617SMike Bayer    between "SET IDENTITY_INSERT" mode when values specified for IDENTITY columns 
5297242a617SMike Bayer    - now supports multi-column foreign keys
5307242a617SMike Bayer    - fix to reflecting date/datetime columns
5317242a617SMike Bayer    - NCHAR and NVARCHAR type support added
532bbd7c660SMike Bayer    - Oracle:
533bbd7c660SMike Bayer    - Oracle has experimental support for cx_Oracle.TIMESTAMP, which requires
534bbd7c660SMike Bayer    a setinputsizes() call on the cursor that is now enabled via the
535bbd7c660SMike Bayer    'auto_setinputsizes' flag to the oracle dialect.  
536758828edSMike Bayer    - Firebird:
537758828edSMike Bayer    - aliases do not use "AS"
538758828edSMike Bayer    - correctly raises NoSuchTableError when reflecting non-existent table
5397242a617SMike Bayer- Schema:
5408340006dSMike Bayer    - a fair amount of cleanup to the schema package, removal of ambiguous
5418340006dSMike Bayer    methods, methods that are no longer needed.  slightly more constrained
5428340006dSMike Bayer    useage, greater emphasis on explicitness
5438340006dSMike Bayer    - the "primary_key" attribute of Table and other selectables becomes
5442bef6699SMike Bayer    a setlike ColumnCollection object; is ordered but not numerically
5458340006dSMike Bayer    indexed.  a comparison clause between two pks that are derived from the 
5468340006dSMike Bayer    same underlying tables (i.e. such as two Alias objects) can be generated 
5478340006dSMike Bayer    via table1.primary_key==table2.primary_key
5487e5e985cSMike Bayer    - ForeignKey(Constraint) supports "use_alter=True", to create/drop a foreign key
5497e5e985cSMike Bayer    via ALTER.  this allows circular foreign key relationships to be set up.
5508340006dSMike Bayer    - append_item() methods removed from Table and Column; preferably
5518340006dSMike Bayer    construct Table/Column/related objects inline, but if needed use 
5528340006dSMike Bayer    append_column(), append_foreign_key(), append_constraint(), etc.
5538340006dSMike Bayer    - table.create() no longer returns the Table object, instead has no
5548340006dSMike Bayer    return value.  the usual case is that tables are created via metadata,
5558340006dSMike Bayer    which is preferable since it will handle table dependencies.
5568340006dSMike Bayer    - added UniqueConstraint (goes at Table level), CheckConstraint
5578340006dSMike Bayer    (goes at Table or Column level).
5588340006dSMike Bayer    - index=False/unique=True on Column now creates a UniqueConstraint,
5598340006dSMike Bayer    index=True/unique=False creates a plain Index, 
5608340006dSMike Bayer    index=True/unique=True on Column creates a unique Index.  'index'
5618340006dSMike Bayer    and 'unique' keyword arguments to column are now boolean only; for
5628340006dSMike Bayer    explcit names and groupings of indexes or unique constraints, use the
5638340006dSMike Bayer    UniqueConstraint/Index constructs explicitly.
5647242a617SMike Bayer    - added autoincrement=True to Column; will disable schema generation
5657242a617SMike Bayer    of SERIAL/AUTO_INCREMENT/identity seq for postgres/mysql/mssql if
5667242a617SMike Bayer    explicitly set to False
5677242a617SMike Bayer    - TypeEngine objects now have methods to deal with copying and comparing
5687242a617SMike Bayer    values of their specific type.  Currently used by the ORM, see below.
5698a1706b4SMike Bayer    - fixed condition that occurred during reflection when a primary key
5708a1706b4SMike Bayer    column was explciitly overridden, where the PrimaryKeyConstraint would
5718a1706b4SMike Bayer    get both the reflected and the programmatic column doubled up
57251f16d14SMike Bayer    - the "foreign_key" attribute on Column and ColumnElement in general
57351f16d14SMike Bayer    is deprecated, in favor of the "foreign_keys" list/set-based attribute,
57451f16d14SMike Bayer    which takes into account multiple foreign keys on one column. 
57551f16d14SMike Bayer    "foreign_key" will return the first element in the "foreign_keys" list/set
57651f16d14SMike Bayer    or None if the list is empty.
5777242a617SMike Bayer- Connections/Pooling/Execution:
5787242a617SMike Bayer    - connection pool tracks open cursors and automatically closes them
5797242a617SMike Bayer    if connection is returned to pool with cursors still opened.  Can be
5807242a617SMike Bayer    affected by options which cause it to raise an error instead, or to 
5817242a617SMike Bayer    do nothing.  fixes issues with MySQL, others
5827242a617SMike Bayer    - fixed bug where Connection wouldnt lose its Transaction
5837242a617SMike Bayer    after commit/rollback
5847242a617SMike Bayer    - added scalar() method to ComposedSQLEngine, ResultProxy
5857242a617SMike Bayer    - ResultProxy will close() the underlying cursor when the ResultProxy
5867242a617SMike Bayer    itself is closed.  this will auto-close cursors for ResultProxy objects
5877242a617SMike Bayer    that have had all their rows fetched (or had scalar() called).
588c934ae44SMike Bayer    - ResultProxy.fetchall() internally uses DBAPI fetchall() for better efficiency,
589c934ae44SMike Bayer    added to mapper iteration as well (courtesy Michael Twomey)
5907242a617SMike Bayer- SQL Construction:
5917242a617SMike Bayer    - changed "for_update" parameter to accept False/True/"nowait"
5927242a617SMike Bayer    and "read", the latter two of which are interpreted only by
5937242a617SMike Bayer    Oracle and Mysql [ticket:292]
5947242a617SMike Bayer    - added extract() function to sql dialect 
5957242a617SMike Bayer    (SELECT extract(field FROM expr))
5967242a617SMike Bayer    - BooleanExpression includes new "negate" argument to specify
5977242a617SMike Bayer    the appropriate negation operator if one is available.
5987242a617SMike Bayer    - calling a negation on an "IN" or "IS" clause will result in
5997242a617SMike Bayer    "NOT IN", "IS NOT" (as opposed to NOT (x IN y)). 
600bbd7c660SMike Bayer    - Function objects know what to do in a FROM clause now.  their
601bbd7c660SMike Bayer    behavior should be the same, except now you can also do things like
602bbd7c660SMike Bayer    select(['*'], from_obj=[func.my_function()]) to get multiple 
603bbd7c660SMike Bayer    columns from the result, or even use sql.column() constructs to name the 
604bbd7c660SMike Bayer    return columns [ticket:172]
6057242a617SMike Bayer- ORM:
6067242a617SMike Bayer    - attribute tracking modified to be more intelligent about detecting
6077242a617SMike Bayer    changes, particularly with mutable types.  TypeEngine objects now
6087242a617SMike Bayer    take a greater role in defining how to compare two scalar instances,
6097242a617SMike Bayer    including the addition of a MutableType mixin which is implemented by
6107242a617SMike Bayer    PickleType.  unit-of-work now tracks the "dirty" list as an expression
6117242a617SMike Bayer    of all persistent objects where the attribute manager detects changes.
6127242a617SMike Bayer    The basic issue thats fixed is detecting changes on PickleType 
6137242a617SMike Bayer    objects, but also generalizes type handling and "modified" object
6147242a617SMike Bayer    checking to be more complete and extensible.
615beff0e1eSMike Bayer    - a wide refactoring to "attribute loader" and "options" architectures.
616bbd7c660SMike Bayer    ColumnProperty and PropertyLoader define their loading behaivor via switchable
617beff0e1eSMike Bayer    "strategies", and MapperOptions no longer use mapper/property copying 
618beff0e1eSMike Bayer    in order to function; they are instead propigated via QueryContext
6194c235340SMike Bayer    and SelectionContext objects at query/instances time.
6204c235340SMike Bayer    All of the internal copying of mappers and properties that was used to handle
621bbd7c660SMike Bayer    inheritance as well as options() has been removed; the structure
6224c235340SMike Bayer    of mappers and properties is much simpler than before and is clearly laid out
6234c235340SMike Bayer    in the new 'interfaces' module.
624beff0e1eSMike Bayer    - related to the mapper/property overhaul, internal refactoring to 
625beff0e1eSMike Bayer    mapper instances() method to use a SelectionContext object to track 
626beff0e1eSMike Bayer    state during the operation.
6277242a617SMike Bayer    SLIGHT API BREAKAGE: the append_result() and populate_instances()
6287242a617SMike Bayer    methods on MapperExtension have a slightly different method signature
6297242a617SMike Bayer    now as a result of the change; hoping that these methods are not 
6307242a617SMike Bayer    in widespread use as of yet.
6316a38b502SMike Bayer    - instances() method moved to Query now, backwards-compatible 
6326a38b502SMike Bayer    version remains on Mapper.  
6336a38b502SMike Bayer    - added contains_eager() MapperOption, used in conjunction with
6346a38b502SMike Bayer    instances() to specify properties that should be eagerly loaded
6356a38b502SMike Bayer    from the result set, using their plain column names by default, or translated
6366a38b502SMike Bayer    given an custom row-translation function.
6377242a617SMike Bayer    - more rearrangements of unit-of-work commit scheme to better allow
6387242a617SMike Bayer    dependencies within circular flushes to work properly...updated
6397242a617SMike Bayer    task traversal/logging implementation
640ef77cfa6SMike Bayer    - polymorphic mappers (i.e. using inheritance) now produces INSERT
641ef77cfa6SMike Bayer    statements in order of tables across all inherited classes
642ef77cfa6SMike Bayer    [ticket:321]
6437242a617SMike Bayer    - added an automatic "row switch" feature to mapping, which will
6447242a617SMike Bayer    detect a pending instance/deleted instance pair with the same 
6457242a617SMike Bayer    identity key and convert the INSERT/DELETE to a single UPDATE
6467242a617SMike Bayer    - "association" mappings simplified to take advantage of 
6477242a617SMike Bayer    automatic "row switch" feature
6486f1eb443SMike Bayer    - "custom list classes" is now implemented via the "collection_class"
6496f1eb443SMike Bayer    keyword argument to relation().  the old way still works but is
6506f1eb443SMike Bayer    deprecated [ticket:212]
6517242a617SMike Bayer    - added "viewonly" flag to relation(), allows construction of
6527242a617SMike Bayer    relations that have no effect on the flush() process.
6537242a617SMike Bayer    - added "lockmode" argument to base Query select/get functions, 
6547242a617SMike Bayer    including "with_lockmode" function to get a Query copy that has 
6557242a617SMike Bayer    a default locking mode.  Will translate "read"/"update" 
6567242a617SMike Bayer    arguments into a for_update argument on the select side.
6577242a617SMike Bayer    [ticket:292]
6587242a617SMike Bayer    - implemented "version check" logic in Query/Mapper, used
6597242a617SMike Bayer    when version_id_col is in effect and query.with_lockmode()
6607242a617SMike Bayer    is used to get() an instance thats already loaded
6617242a617SMike Bayer    - post_update behavior improved; does a better job at not 
6627242a617SMike Bayer    updating too many rows, updates only required columns
6637242a617SMike Bayer    [ticket:208]
6647242a617SMike Bayer    - adjustments to eager loading so that its "eager chain" is
6657242a617SMike Bayer    kept separate from the normal mapper setup, thereby
6667242a617SMike Bayer    preventing conflicts with lazy loader operation, fixes 
6677242a617SMike Bayer    [ticket:308]
6687242a617SMike Bayer    - fix to deferred group loading
6690d75e596SMike Bayer    - session.flush() wont close a connection it opened [ticket:346]
6707242a617SMike Bayer    - added "batch=True" flag to mapper; if False, save_obj
6717242a617SMike Bayer    will fully save one object at a time including calls
6727242a617SMike Bayer    to before_XXXX and after_XXXX
673506b594fSMike Bayer    - added "column_prefix=None" argument to mapper; prepends the
674506b594fSMike Bayer    given string (typically '_') to column-based attributes automatically
675506b594fSMike Bayer    set up from the mapper's Table
6767242a617SMike Bayer    - specifying joins in the from_obj argument of query.select() will
6777242a617SMike Bayer    replace the main table of the query, if the table is somewhere within
6787242a617SMike Bayer    the given from_obj.  this makes it possible to produce custom joins and
6797242a617SMike Bayer    outerjoins in queries without the main table getting added twice.
6807242a617SMike Bayer    [ticket:315]
6817242a617SMike Bayer    - eagerloading is adjusted to more thoughtfully attach its LEFT OUTER JOINs
6827242a617SMike Bayer    to the given query, looking for custom "FROM" clauses that may have 
6837242a617SMike Bayer    already been set up.
6847242a617SMike Bayer    - added join_to and outerjoin_to transformative methods to SelectResults,
6857242a617SMike Bayer    to build up join/outerjoin conditions based on property names. also
6867242a617SMike Bayer    added select_from to explicitly set from_obj parameter.
687819ef543SMike Bayer    - removed "is_primary" flag from mapper.
68845dd486eSMike Bayer
6898b313b35SMike Bayer0.2.8
6908260ca27SMike Bayer- cleanup on connection methods + documentation.  custom DBAPI
6918260ca27SMike Bayerarguments specified in query string, 'connect_args' argument
6928260ca27SMike Bayerto 'create_engine', or custom creation function via 'creator'
6938260ca27SMike Bayerfunction to 'create_engine'.
6948260ca27SMike Bayer- added "recycle" argument to Pool, is "pool_recycle" on create_engine,
6958260ca27SMike Bayerdefaults to 3600 seconds; connections after this age will be closed and
6968260ca27SMike Bayerreplaced with a new one, to handle db's that automatically close 
6978260ca27SMike Bayerstale connections [ticket:274]
69847332cb1SMike Bayer- changed "invalidate" semantics with pooled connection; will 
69947332cb1SMike Bayerinstruct the underlying connection record to reconnect the next 
70047332cb1SMike Bayertime its called.  "invalidate" will also automatically be called
70147332cb1SMike Bayerif any error is thrown in the underlying call to connection.cursor().
70247332cb1SMike Bayerthis will hopefully allow the connection pool to reconnect to a
70347332cb1SMike Bayerdatabase that had been stopped and started without restarting
70447332cb1SMike Bayerthe connecting application [ticket:121] 
7058b313b35SMike Bayer- eesh !  the tutorial doctest was broken for quite some time.
7068b313b35SMike Bayer- add_property() method on mapper does a "compile all mappers"
7078b313b35SMike Bayerstep in case the given property references a non-compiled mapper
7088b313b35SMike Bayer(as it did in the case of the tutorial !)
709698725a1SMike Bayer- [ticket:277] check for pg sequence already existing before create
710ef606acaSMike Bayer- if a contextual session is established via MapperExtension.get_session
711ef606acaSMike Bayer(as it is using the sessioncontext plugin, etc), a lazy load operation
712ef606acaSMike Bayerwill use that session by default if the parent object is not 
713ef606acaSMike Bayerpersistent with a session already.
7145bcb6e78SMike Bayer- lazy loads will not fire off for an object that does not have a 
7155bcb6e78SMike Bayerdatabase identity (why?  
7165bcb6e78SMike Bayersee http://www.sqlalchemy.org/trac/wiki/WhyDontForeignKeysLoadData)
717c48177f0SMike Bayer- unit-of-work does a better check for "orphaned" objects that are
718c48177f0SMike Bayerpart of a "delete-orphan" cascade, for certain conditions where the 
719c48177f0SMike Bayerparent isnt available to cascade from.
72035e2f668SMike Bayer- mappers can tell if one of their objects is an "orphan" based
72135e2f668SMike Bayeron interactions with the attribute package. this check is based
72235e2f668SMike Bayeron a status flag maintained for each relationship 
723fe0a1aa7SMike Bayerwhen objects are attached and detached from each other.
724c48177f0SMike Bayer- it is now invalid to declare a self-referential relationship with
725c48177f0SMike Bayer"delete-orphan" (as the abovementioned check would make them impossible
726c48177f0SMike Bayerto save)
727c48177f0SMike Bayer- improved the check for objects being part of a session when the
728c48177f0SMike Bayerunit of work seeks to flush() them as part of a relationship..
729fc17f7e6SMike Bayer- [ticket:280] statement execution supports using the same BindParam
730fc17f7e6SMike Bayerobject more than once in an expression; simplified handling of positional
731fc17f7e6SMike Bayerparameters.  nice job by Bill Noon figuring out the basic idea.
732d0a3313eSMike Bayer- postgres reflection moved to use pg_schema tables, can be overridden
733d0a3313eSMike Bayerwith use_information_schema=True argument to create_engine
734d0a3313eSMike Bayer[ticket:60], [ticket:71]
7350c7250a4SMike Bayer- added case_sensitive argument to MetaData, Table, Column, determines
7360c7250a4SMike Bayeritself automatically based on if a parent schemaitem has a non-None
7370c7250a4SMike Bayersetting for the flag, or if not, then whether the identifier name is all lower
7380c7250a4SMike Bayercase or not.  when set to True, quoting is applied to identifiers with mixed or 
7390c7250a4SMike Bayeruppercase identifiers.  quoting is also applied automatically in all cases to 
7400c7250a4SMike Bayeridentifiers that are known to be reserved words or contain other non-standard 
7410c7250a4SMike Bayercharacters. various database dialects can override all of this behavior, but 
7420c7250a4SMike Bayercurrently they are all using the default behavior.  tested with postgres, mysql, 
743165065a9SMike Bayersqlite, oracle.  needs more testing with firebird, ms-sql. part of the ongoing 
7440c7250a4SMike Bayerwork with [ticket:155]
74543d3b773SMike Bayer- unit tests updated to run without any pysqlite installed; pool
74643d3b773SMike Bayertest uses a mock DBAPI
747a8d1aecfSMike Bayer- urls support escaped characters in passwords [ticket:281]
7482d4dfb95SMike Bayer- added limit/offset to UNION queries (though not yet in oracle)
7492d4dfb95SMike Bayer- added "timezone=True" flag to DateTime and Time types.  postgres
7502d4dfb95SMike Bayerso far will convert this to "TIME[STAMP] (WITH|WITHOUT) TIME ZONE",
7512d4dfb95SMike Bayerso that control over timezone presence is more controllable (psycopg2
7522d4dfb95SMike Bayerreturns datetimes with tzinfo's if available, which can create confusion
7532d4dfb95SMike Bayeragainst datetimes that dont).
7547252ccd7SMike Bayer- fix to using query.count() with distinct, **kwargs with SelectResults
7557252ccd7SMike Bayercount() [ticket:287]
7562e077dc6SMike Bayer- deregister Table from MetaData when autoload fails; [ticket:289]
7579deaebf9SMike Bayer- import of py2.5s sqlite3 [ticket:293]
758f3d72a71SMike Bayer- unicode fix for startswith()/endswith() [ticket:296]
7598b313b35SMike Bayer
760d8ca865fSMike Bayer0.2.7
7619e8fad2aSMike Bayer- quoting facilities set up so that database-specific quoting can be
7629e8fad2aSMike Bayerturned on for individual table, schema, and column identifiers when
7639e8fad2aSMike Bayerused in all queries/creates/drops.  Enabled via "quote=True" in 
7649e8fad2aSMike BayerTable or Column, as well as "quote_schema=True" in Table.  Thanks to
7659e8fad2aSMike BayerAaron Spike for his excellent efforts.
766d8ca865fSMike Bayer- assignmapper was setting is_primary=True, causing all sorts of mayhem
767d8ca865fSMike Bayerby not raising an error when redundant mappers were set up, fixed
7687f872628SMike Bayer- added allow_null_pks option to Mapper, allows rows where some
7697f872628SMike Bayerprimary key columns are null (i.e. when mapping to outer joins etc)
770ae5e73cbSMike Bayer- modifcation to unitofwork to not maintain ordering within the
771ae5e73cbSMike Bayer"new" list or within the UOWTask "objects" list; instead, new objects
772ae5e73cbSMike Bayerare tagged with an ordering identifier as they are registered as new
773ae5e73cbSMike Bayerwith the session, and the INSERT statements are then sorted within the 
774ae5e73cbSMike Bayermapper save_obj.  the INSERT ordering has basically been pushed all
775ae5e73cbSMike Bayerthe way to the end of the flush cycle. that way the various sorts and 
776ae5e73cbSMike Bayerorganizations occuring within UOWTask (particularly the circular task 
777ae5e73cbSMike Bayersort) dont have to worry about maintaining order (which they werent anyway)
778946984d8SMike Bayer- fixed reflection of foreign keys to autoload the referenced table
779946984d8SMike Bayerif it was not loaded already
7803c14b364SMike Bayer- [ticket:256] - pass URL query string arguments to connect() function
781369ffb78SMike Bayer- [ticket:257] - oracle boolean type
7823b41d5c6SMike Bayer- custom primary/secondary join conditions in a relation *will* be propigated
7833b41d5c6SMike Bayerto backrefs by default.  specifying a backref() will override this behavior.
784aaefbb7eSMike Bayer- better check for ambiguous join conditions in sql.Join; propigates to a
785aaefbb7eSMike Bayerbetter error message in PropertyLoader (i.e. relation()/backref()) for when
786aaefbb7eSMike Bayerthe join condition can't be reasonably determined.
787aaefbb7eSMike Bayer- sqlite creates ForeignKeyConstraint objects properly upon table 
788aaefbb7eSMike Bayerreflection.
7898f94457eSMike Bayer- adjustments to pool stemming from changes made for [ticket:224]. 
7908f94457eSMike Bayeroverflow counter should only be decremented if the connection actually
7918f94457eSMike Bayersucceeded.  added a test script to attempt testing this.
792f8c9688bSMike Bayer- fixed mysql reflection of default values to be PassiveDefault
7934488b655SMike Bayer- added reflected 'tinyint', 'mediumint' type to MS-SQL [ticket:263], 
7944488b655SMike Bayer[ticket:264]
7952801ced9SMike Bayer- SingletonThreadPool has a size and does a cleanup pass, so that 
7962801ced9SMike Bayeronly a given number of thread-local connections stay around (needed
7972801ced9SMike Bayerfor sqlite applications that dispose of threads en masse)
798aff1798cSMike Bayer- fixed small pickle bug(s) with lazy loaders [ticket:265] [ticket:267]
799a38cc03bSMike Bayer- fixed possible error in mysql reflection where certain versions
800a38cc03bSMike Bayerreturn an array instead of string for SHOW CREATE TABLE call
801dde6a5aaSMike Bayer- fix to lazy loads when mapping to joins [changeset:1770]
802dde6a5aaSMike Bayer- all create()/drop() calls have a keyword argument of "connectable".
803dde6a5aaSMike Bayer"engine" is deprecated.
8043d917a4aSMike Bayer- fixed ms-sql connect() to work with adodbapi
80554967375SMike Bayer- added "nowait" flag to Select()
80661b7d4fbSMike Bayer- inheritance check uses issubclass() instead of direct __mro__ check
80761b7d4fbSMike Bayerto make sure class A inherits from B, allowing mapper inheritance to more 
80861b7d4fbSMike Bayerflexibly correspond to class inheritance [ticket:271]
809c48727aeSMike Bayer- SelectResults will use a subselect, when calling an aggregate (i.e.
810c48727aeSMike Bayermax, min, etc.) on a SelectResults that has an ORDER BY clause
811c48727aeSMike Bayer[ticket:252]
81226efe4f6SMike Bayer- fixes to types so that database-specific types more easily used;
81326efe4f6SMike Bayerfixes to mysql text types to work with this methodology
81426efe4f6SMike Bayer[ticket:269] 
8150b895ee6SMike Bayer- some fixes to sqlite date type organization
81698933ba8SMike Bayer- added MSTinyInteger to MS-SQL [ticket:263]
817d8ca865fSMike Bayer
8185c799308SMike Bayer0.2.6
819bc6fbfa8SMike Bayer- big overhaul to schema to allow truly composite primary and foreign
820bc6fbfa8SMike Bayerkey constraints, via new ForeignKeyConstraint and PrimaryKeyConstraint
821bc6fbfa8SMike Bayerobjects.
822bc6fbfa8SMike BayerExisting methods of primary/foreign key creation have not been changed
823bc6fbfa8SMike Bayerbut use these new objects behind the scenes.  table creation
824bc6fbfa8SMike Bayerand reflection is now more table oriented rather than column oriented.
825bc6fbfa8SMike Bayer[ticket:76]
8264a02ef1cSMike Bayer- overhaul to MapperExtension calling scheme, wasnt working very well 
8274a02ef1cSMike Bayerpreviously
8285c799308SMike Bayer- tweaks to ActiveMapper, supports self-referential relationships
8292dfdf706SMike Bayer- slight rearrangement to objectstore (in activemapper/threadlocal)
8302dfdf706SMike Bayerso that the SessionContext is referenced by '.context' instead
8312dfdf706SMike Bayerof subclassed directly.
8322dfdf706SMike Bayer- activemapper will use threadlocal's objectstore if the mod is
8332dfdf706SMike Bayeractivated when activemapper is imported
8342dfdf706SMike Bayer- small fix to URL regexp to allow filenames with '@' in them
83592a86a08SMike Bayer- fixes to Session expunge/update/etc...needs more cleanup.
8367cb8f04fSMike Bayer- select_table mappers *still* werent always compiling
8372cb2b624SMike Bayer- fixed up Boolean datatype
83870469bf2SMike Bayer- added count()/count_by() to list of methods proxied by assignmapper;
83970469bf2SMike Bayerthis also adds them to activemapper
8403bf88a17SMike Bayer- connection exceptions wrapped in DBAPIError
841e58578cbSJonathan LaCour- ActiveMapper now supports autoloading column definitions from the
842e58578cbSJonathan LaCourdatabase if you supply a __autoload__ = True attribute in your
843e58578cbSJonathan LaCourmapping inner-class.  Currently this does not support reflecting 
844e58578cbSJonathan LaCourany relationships.
845d4c60a64SMike Bayer- deferred column load could screw up the connection status in 
846d4c60a64SMike Bayera flush() under some circumstances, this was fixed
847fbe71c17SMike Bayer- expunge() was not working with cascade, fixed.
848fbe71c17SMike Bayer- potential endless loop in cascading operations fixed.
849e98e8786SMike Bayer- added "synonym()" function, applied to properties to have a 
850e98e8786SMike Bayerpropname the same as another, for the purposes of overriding props
851e98e8786SMike Bayerand allowing the original propname to be accessible in select_by().
852d2513a54SMike Bayer- fix to typing in clause construction which specifically helps
853d2513a54SMike Bayertype issues with polymorphic_union (CAST/ColumnClause propigates
854d2513a54SMike Bayerits type to proxy columns)
855f4415c21SMike Bayer- mapper compilation work ongoing, someday it'll work....moved 
856f4415c21SMike Bayeraround the initialization of MapperProperty objects to be after
857f4415c21SMike Bayerall mappers are created to better handle circular compilations.
858f4415c21SMike Bayerdo_init() method is called on all properties now which are more 
859f4415c21SMike Bayeraware of their "inherited" status if so.
860f4415c21SMike Bayer- eager loads explicitly disallowed on self-referential relationships, or
861f4415c21SMike Bayerrelationships to an inheriting mapper (which is also self-referential)
862219730daSMike Bayer- reduced bind param size in query._get to appease the picky oracle 
863219730daSMike Bayer[ticket:244]
864934ac330SMike Bayer- added 'checkfirst' argument to table.create()/table.drop(), as 
865934ac330SMike Bayerwell as table.exists() [ticket:234]
8660b7557a3SMike Bayer- some other ongoing fixes to inheritance [ticket:245]
867005603e2SMike Bayer- attribute/backref/orphan/history-tracking tweaks as usual...
8685c799308SMike Bayer
8692fb9221bSMike Bayer0.2.5
8702fb9221bSMike Bayer- fixed endless loop bug in select_by(), if the traversal hit
8712fb9221bSMike Bayertwo mappers that referenced each other
872b3927fbbSMike Bayer- upgraded all unittests to insert './lib/' into sys.path, 
873b3927fbbSMike Bayerworking around new setuptools PYTHONPATH-killing behavior
8746446bb13SMike Bayer- further fixes with attributes/dependencies/etc....
8756133dbeeSMike Bayer- improved error handling for when DynamicMetaData is not connected
876cce1f073SMike Bayer- MS-SQL support largely working (tested with pymssql)
87761579c93SMike Bayer- ordering of UPDATE and DELETE statements within groups is now 
87861579c93SMike Bayerin order of primary key values, for more deterministic ordering
87961579c93SMike Bayer- after_insert/delete/update mapper extensions now called per object,
88061579c93SMike Bayernot per-object-per-table
881eeb4b2c8SMike Bayer- further fixes/refactorings to mapper compilation 
8822fb9221bSMike Bayer
883d97ee85cSMike Bayer0.2.4
884d97ee85cSMike Bayer- try/except when the mapper sets init.__name__ on a mapped class,
885d97ee85cSMike Bayersupports python 2.3
8865f3451fcSMike Bayer- fixed bug where threadlocal engine would still autocommit
8875f3451fcSMike Bayerdespite a transaction in progress
88869549460SMike Bayer- lazy load and deferred load operations require the parent object
88969549460SMike Bayerto be in a Session to do the operation; whereas before the operation
89069549460SMike Bayerwould just return a blank list or None, it now raises an exception.
89169549460SMike Bayer- Session.update() is slightly more lenient if the session to which
89269549460SMike Bayerthe given object was formerly attached to was garbage collected;
89369549460SMike Bayerotherwise still requires you explicitly remove the instance from 
89469549460SMike Bayerthe previous Session.
895e2b5b9d0SMike Bayer- fixes to mapper compilation, checking for more error conditions
89640e9887bSMike Bayer- small fix to eager loading combined with ordering/limit/offset
897ac56d17aSMike Bayer- utterly remarkable:  added a single space between 'CREATE TABLE'
898ac56d17aSMike Bayerand '(<the rest of it>' since *thats how MySQL indicates a non-
899ac56d17aSMike Bayerreserved word tablename.....* [ticket:206]
900ad7ffd76SMike Bayer- more fixes to inheritance, related to many-to-many relations
901ad7ffd76SMike Bayerproperly saving
902ff8458abSMike Bayer- fixed bug when specifying explicit module to mysql dialect
903dc1cc365SMike Bayer- when QueuePool times out it raises a TimeoutError instead of
904dc1cc365SMike Bayererroneously making another connection
9059dd15963SMike Bayer- Queue.Queue usage in pool has been replaced with a locally
9069dd15963SMike Bayermodified version (works in py2.3/2.4!) that uses a threading.RLock 
9079dd15963SMike Bayerfor a mutex.  this is to fix a reported case where a ConnectionFairy's 
9089dd15963SMike Bayer__del__() method got called within the Queue's get() method, which 
9099dd15963SMike Bayerthen returns its connection to the Queue via the the put() method, 
9109dd15963SMike Bayercausing a reentrant hang unless threading.RLock is used.
911a635e96bSMike Bayer- postgres will not place SERIAL keyword on a primary key column
912a635e96bSMike Bayerif it has a foreign key constraint
913662bd403SMike Bayer- cursor() method on ConnectionFairy allows db-specific extension
914662bd403SMike Bayerarguments to be propigated [ticket:221]
91500844ac4SMike Bayer- lazy load bind params properly propigate column type [ticket:225]
916d4cbae66SMike Bayer- new MySQL types: MSEnum, MSTinyText, MSMediumText, MSLongText, etc.
917d4cbae66SMike Bayermore support for MS-specific length/precision params in numeric types
918d4cbae66SMike Bayerpatch courtesy Mike Bernson
9197626fc5aSMike Bayer- some fixes to connection pool invalidate() [ticket:224]
920d97ee85cSMike Bayer
921a4252a12SMike Bayer0.2.3
922f9468e87SMike Bayer- overhaul to mapper compilation to be deferred.  this allows mappers
923f9468e87SMike Bayerto be constructed in any order, and their relationships to each
92484fdccc0SMike Bayerother are compiled when the mappers are first used.
925f9468e87SMike Bayer- fixed a pretty big speed bottleneck in cascading behavior particularly
926f9468e87SMike Bayerwhen backrefs were in use
92784fdccc0SMike Bayer- the attribute instrumentation module has been completely rewritten; its
92884fdccc0SMike Bayernow a large degree simpler and clearer, slightly faster.  the "history"
92984fdccc0SMike Bayerof an attribute is no longer micromanaged with each change and is
93084fdccc0SMike Bayerinstead part of a "CommittedState" object created when the 
93184fdccc0SMike Bayerinstance is first loaded.  HistoryArraySet is gone, the behavior of
93284fdccc0SMike Bayerlist attributes is now more open ended (i.e. theyre not sets anymore).
933a4252a12SMike Bayer- py2.4 "set" construct used internally, falls back to sets.Set when
934a4252a12SMike Bayer"set" not available/ordering is needed.
93597dd5dabSMike Bayer- fix to transaction control, so that repeated rollback() calls 
93697dd5dabSMike Bayerdont fail (was failing pretty badly when flush() would raise 
93797dd5dabSMike Bayeran exception in a larger try/except transaction block)
938a4252a12SMike Bayer- "foreignkey" argument to relation() can also be a list.  fixed
939a4252a12SMike Bayerauto-foreignkey detection [ticket:151]
940d37d8681SMike Bayer- fixed bug where tables with schema names werent getting indexed in
941d37d8681SMike Bayerthe MetaData object properly
9423f8bfe51SMike Bayer- fixed bug where Column with redefined "key" property wasnt getting
9433f8bfe51SMike Bayertype conversion happening in the ResultProxy [ticket:207]
944b63c5cc8SMike Bayer- fixed 'port' attribute of URL to be an integer if present
945091d4034SMike Bayer- fixed old bug where if a many-to-many table mapped as "secondary"
946091d4034SMike Bayerhad extra columns, delete operations didnt work
947bcc4f63aSMike Bayer- bugfixes for mapping against UNION queries
94897dd5dabSMike Bayer- fixed incorrect exception class thrown when no DB driver present
94997dd5dabSMike Bayer- added NonExistentTable exception thrown when reflecting a table
95097dd5dabSMike Bayerthat doesnt exist [ticket:138]
95197dd5dabSMike Bayer- small fix to ActiveMapper regarding one-to-one backrefs, other
95297dd5dabSMike Bayerrefactorings
95397dd5dabSMike Bayer- overridden constructor in mapped classes gets __name__ and
95497dd5dabSMike Bayer__doc__ from the original class
95597dd5dabSMike Bayer- fixed small bug in selectresult.py regarding mapper extension
95697dd5dabSMike Bayer[ticket:200]
95797dd5dabSMike Bayer- small tweak to cascade_mappers, not very strongly supported 
95897dd5dabSMike Bayerfunction at the moment
95997dd5dabSMike Bayer- some fixes to between(), column.between() to propigate typing
96097dd5dabSMike Bayerinformation better [ticket:202]
9613736b3ddSMike Bayer- if an object fails to be constructed, is not added to the 
9623736b3ddSMike Bayersession [ticket:203]
9631ffed843SMike Bayer- CAST function has been made into its own clause object with
9641ffed843SMike Bayerits own compilation function in ansicompiler; allows MySQL
9651ffed843SMike Bayerto silently ignore most CAST calls since MySQL
9661ffed843SMike Bayerseems to only support the standard CAST syntax with Date types.  
9671ffed843SMike BayerMySQL-compatible CAST support for strings, ints, etc. a TODO
968a4252a12SMike Bayer
96916d222eaSMike Bayer0.2.2
97016d222eaSMike Bayer- big improvements to polymorphic inheritance behavior, enabling it
97116d222eaSMike Bayerto work with adjacency list table structures [ticket:190]
972ea717b54SMike Bayer- major fixes and refactorings to inheritance relationships overall,
973ea717b54SMike Bayermore unit tests
97416d222eaSMike Bayer- fixed "echo_pool" flag on create_engine()
97516d222eaSMike Bayer- fix to docs, removed incorrect info that close() is unsafe to use
97616d222eaSMike Bayerwith threadlocal strategy (its totally safe !)
97716d222eaSMike Bayer- create_engine() can take URLs as string or unicode [ticket:188]
9782b9322f6SMike Bayer- firebird support partially completed; 
9792b9322f6SMike Bayerthanks to James Ralston and Brad Clements for their efforts.
980ff64be5eSMike Bayer- Oracle url translation was broken, fixed, will feed host/port/sid
981ff64be5eSMike Bayerinto cx_oracle makedsn() if 'database' field is present, else uses 
982ff64be5eSMike Bayerstraight TNS name from the 'host' field
9832b9322f6SMike Bayer- fix to using unicode criterion for query.get()/query.load()
9842b9322f6SMike Bayer- count() function on selectables now uses table primary key or 
9852b9322f6SMike Bayerfirst column instead of "1" for criterion, also uses label "rowcount"
9862b9322f6SMike Bayerinstead of "count".  
987297d35baSMike Bayer- got rudimental "mapping to multiple tables" functionality cleaned up, 
988297d35baSMike Bayermore correctly documented
989cfcf4733SMike Bayer- restored global_connect() function, attaches to a DynamicMetaData
990cfcf4733SMike Bayerinstance called "default_metadata".  leaving MetaData arg to Table
991cfcf4733SMike Bayerout will use the default metadata.
992120dcee5SMike Bayer- fixes to session cascade behavior, entity_name propigation
993120dcee5SMike Bayer- reorganized unittests into subdirectories
99482ee832cSMike Bayer- more fixes to threadlocal connection nesting patterns
995120dcee5SMike Bayer
996d689e125SMike Bayer0.2.1
997d689e125SMike Bayer- "pool" argument to create_engine() properly propigates
998d689e125SMike Bayer- fixes to URL, raises exception if not parsed, does not pass blank
999d689e125SMike Bayerfields along to the DB connect string (a string such as 
1000d689e125SMike Bayeruser:host@/db was breaking on postgres)
1001d689e125SMike Bayer- small fixes to Mapper when it inserts and tries to get
1002d689e125SMike Bayernew primary key values back
1003d689e125SMike Bayer- rewrote half of TLEngine, the ComposedSQLEngine used with 
1004d689e125SMike Bayer'strategy="threadlocal"'.  it now properly implements engine.begin()/
1005d689e125SMike Bayerengine.commit(), which nest fully with connection.begin()/trans.commit().
1006d689e125SMike Bayeradded about six unittests.
1007d689e125SMike Bayer- major "duh" in pool.Pool, forgot to put back the WeakValueDictionary.
1008d689e125SMike Bayerunittest which was supposed to check for this was also silently missing
100929dd5916SMike Bayerit.  fixed unittest to ensure that ConnectionFairy properly falls out
1010d689e125SMike Bayerof scope.
1011d689e125SMike Bayer- placeholder dispose() method added to SingletonThreadPool, doesnt 
1012d689e125SMike Bayerdo anything yet
1013d689e125SMike Bayer- rollback() is automatically called when an exception is raised,
1014d689e125SMike Bayerbut only if theres no transaction in process (i.e. works more like
1015d689e125SMike Bayerautocommit).
1016d689e125SMike Bayer- fixed exception raise in sqlite if no sqlite module present
1017d689e125SMike Bayer- added extra example detail for association object doc
1018d689e125SMike Bayer- Connection adds checks for already being closed
1019d689e125SMike Bayer
1020967171f5SMike Bayer0.2.0
1021bb79e2e8SMike Bayer- overhaul to Engine system so that what was formerly the SQLEngine
1022bb79e2e8SMike Bayeris now a ComposedSQLEngine which consists of a variety of components,
1023bb79e2e8SMike Bayerincluding a Dialect, ConnectionProvider, etc. This impacted all the
1024bb79e2e8SMike Bayerdb modules as well as Session and Mapper.
1025bb79e2e8SMike Bayer- create_engine now takes only RFC-1738-style strings:
1026bb79e2e8SMike Bayerdriver://user:password@host:port/database
1027bb79e2e8SMike Bayer- total rewrite of connection-scoping methodology, Connection objects
1028bb79e2e8SMike Bayercan now execute clause elements directly, added explicit "close" as
1029bb79e2e8SMike Bayerwell as support throughout Engine/ORM to handle closing properly,
1030bb79e2e8SMike Bayerno longer relying upon __del__ internally to return connections 
1031bb79e2e8SMike Bayerto the pool [ticket:152].
1032bb79e2e8SMike Bayer- overhaul to Session interface and scoping.  uses hibernate-style
1033bb79e2e8SMike Bayermethods, including query(class), save(), save_or_update(), etc.
1034bb79e2e8SMike Bayerno threadlocal scope is installed by default.  Provides a binding
1035bb79e2e8SMike Bayerinterface to specific Engines and/or Connections so that underlying
1036bb79e2e8SMike BayerSchema objects do not need to be bound to an Engine.  Added a basic
1037bb79e2e8SMike BayerSessionTransaction object that can simplistically aggregate transactions 
1038bb79e2e8SMike Bayeracross multiple engines.
1039bb79e2e8SMike Bayer- overhaul to mapper's dependency and "cascade" behavior; dependency logic
1040bb79e2e8SMike Bayerfactored out of properties.py into a separate module "dependency.py".
1041bb79e2e8SMike Bayer"cascade" behavior is now explicitly controllable, proper implementation 
1042bb79e2e8SMike Bayerof "delete", "delete-orphan", etc.  dependency system can now determine at 
1043bb79e2e8SMike Bayerflush time if a child object has a parent or not so that it makes better 
1044bb79e2e8SMike Bayerdecisions on how that child should be updated in the DB with regards to deletes.
1045bb79e2e8SMike Bayer- overhaul to Schema to build upon MetaData object instead of an Engine.
1046bb79e2e8SMike BayerEntire SQL/Schema system can be used with no Engines whatsoever, executed
1047bb79e2e8SMike Bayersolely by an explicit Connection object.  the "bound" methodlogy exists via the 
1048bb79e2e8SMike BayerBoundMetaData for schema objects.  ProxyEngine is generally not needed
1049bb79e2e8SMike Bayeranymore and is replaced by DynamicMetaData.
1050bb79e2e8SMike Bayer- true polymorphic behavior implemented, fixes [ticket:167]
1051bb79e2e8SMike Bayer- "oid" system has been totally moved into compile-time behavior; 
1052bb79e2e8SMike Bayerif they are used in an order_by where they are not available, the order_by
1053bb79e2e8SMike Bayerdoesnt get compiled, fixes [ticket:147]
1054bb79e2e8SMike Bayer- overhaul to packaging; "mapping" is now "orm", "objectstore" is now
1055bb79e2e8SMike Bayer"session", the old "objectstore" namespace gets loaded in via the
1056bb79e2e8SMike Bayer"threadlocal" mod if used
1057bb79e2e8SMike Bayer- mods now called in via "import <modname>".  extensions favored over
1058bb79e2e8SMike Bayermods as mods are globally-monkeypatching
1059bb79e2e8SMike Bayer- fix to add_property so that it propigates properties to inheriting 
1060bb79e2e8SMike Bayermappers [ticket:154]
1061bb79e2e8SMike Bayer- backrefs create themselves against primary mapper of its originating
1062bb79e2e8SMike Bayerproperty, priamry/secondary join arguments can be specified to override.
1063bb79e2e8SMike Bayerhelps their usage with polymorphic mappers
1064bb79e2e8SMike Bayer- "table exists" function has been implemented [ticket:31]
1065bb79e2e8SMike Bayer- "create_all/drop_all" added to MetaData object [ticket:98]
1066bb79e2e8SMike Bayer- improvements and fixes to topological sort algorithm, as well as more
1067bb79e2e8SMike Bayerunit tests
1068bb79e2e8SMike Bayer- tutorial page added to docs which also can be run with a custom doctest
106929dd5916SMike Bayerrunner to ensure its properly working.  docs generally overhauled to 
1070bb79e2e8SMike Bayerdeal with new code patterns
107137e97276SMike Bayer- many more fixes, refactorings.
107237e97276SMike Bayer- migration guide is available on the Wiki at 
107337e97276SMike Bayerhttp://www.sqlalchemy.org/trac/wiki/02Migration
107456feb8d9SMike Bayer
1075e7a1ce91SMike Bayer0.1.7
1076e7a1ce91SMike Bayer- some fixes to topological sort algorithm
1077e7a1ce91SMike Bayer- added DISTINCT ON support to Postgres (just supply distinct=[col1,col2..])
1078e7a1ce91SMike Bayer- added __mod__ (% operator) to sql expressions
1079e7a1ce91SMike Bayer- "order_by" mapper property inherited from inheriting mapper
1080e7a1ce91SMike Bayer- fix to column type used when mapper UPDATES/DELETEs
1081e7a1ce91SMike Bayer- with convert_unicode=True, reflection was failing, has been fixed
1082e7a1ce91SMike Bayer- types types types!  still werent working....have to use TypeDecorator again :(
1083e7a1ce91SMike Bayer- mysql binary type converts array output to buffer, fixes PickleType
1084e7a1ce91SMike Bayer- fixed the attributes.py memory leak once and for all
1085e7a1ce91SMike Bayer- unittests are qualified based on the databases that support each one
1086e7a1ce91SMike Bayer- fixed bug where column defaults would clobber VALUES clause of insert objects
1087e7a1ce91SMike Bayer- fixed bug where table def w/ schema name would force engine connection
1088e7a1ce91SMike Bayer- fix for parenthesis to work correctly with subqueries in INSERT/UPDATE
1089e7a1ce91SMike Bayer- HistoryArraySet gets extend() method
1090e7a1ce91SMike Bayer- fixed lazyload support for other comparison operators besides =
1091e7a1ce91SMike Bayer- lazyload fix where two comparisons in the join condition point to the 
1092e7a1ce91SMike Bayersamem column
1093e7a1ce91SMike Bayer- added "construct_new" flag to mapper, will use __new__ to create instances
1094e7a1ce91SMike Bayerinstead of __init__ (standard in 0.2)
1095e7a1ce91SMike Bayer- added selectresults.py to SVN, missed it last time
1096e7a1ce91SMike Bayer- tweak to allow a many-to-many relationship from a table to itself via
1097e7a1ce91SMike Bayeran association table
1098e7a1ce91SMike Bayer- small fix to "translate_row" function used by polymorphic example
1099e7a1ce91SMike Bayer- create_engine uses cgi.parse_qsl to read query string (out the window in 0.2)
1100e7a1ce91SMike Bayer- tweaks to CAST operator
1101e7a1ce91SMike Bayer- fixed function names LOCAL_TIME/LOCAL_TIMESTAMP -> LOCALTIME/LOCALTIMESTAMP
1102e7a1ce91SMike Bayer- fixed order of ORDER BY/HAVING in compile
1103e7a1ce91SMike Bayer
11043ad569a5SMike Bayer0.1.6
110527b8963fSMike Bayer- support for MS-SQL added courtesy Rick Morrison, Runar Petursson
110627b8963fSMike Bayer- the latest SQLSoup from J. Ellis
110727b8963fSMike Bayer- ActiveMapper has preliminary support for inheritance (Jeff Watkins)
110827b8963fSMike Bayer- added a "mods" system which allows pluggable modules that modify/augment
110927b8963fSMike Bayercore functionality, using the function "install_mods(*modnames)".
111027b8963fSMike Bayer- added the first "mod", SelectResults, which modifies mapper selects to
111127b8963fSMike Bayerreturn generators that turn ranges into LIMIT/OFFSET queries (Jonas Borgstr�m)
111227b8963fSMike Bayer- factored out querying capabilities of Mapper into a separate Query object
111327b8963fSMike Bayerwhich is Session-centric.  this improves the performance of mapper.using(session)
111427b8963fSMike Bayerand makes other things possible.
111527b8963fSMike Bayer- objectstore/Session refactored, the official way to save objects is now 
111627b8963fSMike Bayervia the flush() method.  The begin/commit functionality of Session is factored
111727b8963fSMike Bayerinto LegacySession which is still established as the default behavior, until
111827b8963fSMike Bayerthe 0.2 series.
111927b8963fSMike Bayer- types system is bound to an engine at query compile time, not schema
112027b8963fSMike Bayerconstruction time.  this simplifies the types system as well as the ProxyEngine.
11217999c3baSMike Bayer- added 'version_id' keyword argument to mapper. this keyword should reference a
11227999c3baSMike BayerColumn object with type Integer, preferably non-nullable, which will be used on
11237999c3baSMike Bayerthe mapped table to track version numbers. this number is incremented on each
11247999c3baSMike Bayersave operation and is specifed in the UPDATE/DELETE conditions so that it
11257999c3baSMike Bayerfactors into the returned row count, which results in a ConcurrencyError if the
11267999c3baSMike Bayervalue received is not the expected count.
11273ad569a5SMike Bayer- added 'entity_name' keyword argument to mapper. a mapper is now associated
11283ad569a5SMike Bayerwith a class via the class object as well as an optional entity_name parameter,
11293ad569a5SMike Bayerwhich is a string defaulting to None. any number of primary mappers can be
11303ad569a5SMike Bayercreated for a class, qualified by the entity name. instances of those classes
11313ad569a5SMike Bayerwill issue all of their load and save operations through their
11323ad569a5SMike Bayerentity_name-qualified mapper, and maintain separate a identity in the identity
11333ad569a5SMike Bayermap for an otherwise equilvalent object.
11343ad569a5SMike Bayer- overhaul to the attributes system. code has been clarified, and also fixed to
11353ad569a5SMike Bayersupport proper polymorphic behavior on object attributes.
113627b8963fSMike Bayer- added "for_update" flag to Select objects
113727b8963fSMike Bayer- some fixes for backrefs
113827b8963fSMike Bayer- fix for postgres1 DateTime type
113927b8963fSMike Bayer- documentation pages mostly switched over to Markdown syntax
11403ad569a5SMike Bayer
1141bbf9f191SMike Bayer0.1.5
1142a632fa11SMike Bayer- added SQLSession concept to SQLEngine. this object keeps track of retrieving a
1143a632fa11SMike Bayerconnection from the connection pool as well as an in-progress transaction.
1144a632fa11SMike Bayermethods push_session() and pop_session() added to SQLEngine which push/pop a new
1145a632fa11SMike BayerSQLSession onto the engine, allowing operation upon a second connection "nested"
1146a632fa11SMike Bayerwithin the previous one, allowing nested transactions. Other tricks are sure to
1147a632fa11SMike Bayercome later regarding SQLSession.
1148a632fa11SMike Bayer- added nest_on argument to objectstore.Session. This is a single SQLEngine or
1149a632fa11SMike Bayerlist of engines for which push_session()/pop_session() will be called each time
1150a632fa11SMike Bayerthis Session becomes the active session (via objectstore.push_session() or
1151a632fa11SMike Bayerequivalent). This allows a unit of work Session to take advantage of the nested
1152a632fa11SMike Bayertransaction feature without explicitly calling push_session/pop_session on the
1153a632fa11SMike Bayerengine.
1154a632fa11SMike Bayer- factored apart objectstore/unitofwork to separate "Session scoping" from
1155a632fa11SMike Bayer"uow commit heavy lifting"
1156a632fa11SMike Bayer- added populate_instance() method to MapperExtension. allows an extension to
1157a632fa11SMike Bayermodify the population of object attributes. this method can call the
1158a632fa11SMike Bayerpopulate_instance() method on another mapper to proxy the attribute population
1159a632fa11SMike Bayerfrom one mapper to another; some row translation logic is also built in to help
1160a632fa11SMike Bayerwith this.
1161a632fa11SMike Bayer- fixed Oracle8-compatibility "use_ansi" flag which converts JOINs to 
1162a632fa11SMike Bayercomparisons with the = and (+) operators, passes basic unittests
1163a632fa11SMike Bayer- tweaks to Oracle LIMIT/OFFSET support
1164a632fa11SMike Bayer- Oracle reflection uses ALL_** views instead of USER_** to get larger
1165a632fa11SMike Bayerlist of stuff to reflect from
1166a632fa11SMike Bayer- fixes to Oracle foreign key reflection [ticket:105]
1167a632fa11SMike Bayer- objectstore.commit(obj1, obj2,...) adds an extra step to seek out private
1168a632fa11SMike Bayerrelations on properties and delete child objects, even though its not a global
1169a632fa11SMike Bayercommit
1170a632fa11SMike Bayer- lots and lots of fixes to mappers which use inheritance, strengthened the 
1171a632fa11SMike Bayerconcept of relations on a mapper being made towards the "local" table for that
1172a632fa11SMike Bayermapper, not the tables it inherits.  allows more complex compositional patterns
1173a632fa11SMike Bayerto work with lazy/eager loading.
117419e9af44SMike Bayer- added support for mappers to inherit from others based on the same table, 
117519e9af44SMike Bayerjust specify the same table as that of both parent/child mapper.
1176a632fa11SMike Bayer- some minor speed improvements to the attributes system with regards to 
1177a632fa11SMike Bayerinstantiating and populating new objects. 
1178a632fa11SMike Bayer- fixed MySQL binary unit test
1179a632fa11SMike Bayer- INSERTs can receive clause elements as VALUES arguments, not just literal
1180a632fa11SMike Bayervalues
1181a632fa11SMike Bayer- support for calling multi-tokened functions, i.e. schema.mypkg.func()
1182a632fa11SMike Bayer- added J. Ellis' SQLSoup module to extensions package
1183a632fa11SMike Bayer- added "polymorphic" examples illustrating methods to load multiple object types
1184a632fa11SMike Bayerfrom one mapper, the second of which uses the new populate_instance() method.
1185a632fa11SMike Bayersmall improvements to mapper, UNION construct to help the examples along
1186a632fa11SMike Bayer- improvements/fixes to session.refresh()/session.expire() (which may have
1187a632fa11SMike Bayerbeen called "invalidate" earlier..)
1188a632fa11SMike Bayer- added session.expunge() which totally removes an object from the current
1189a632fa11SMike Bayersession
1190a632fa11SMike Bayer- added *args, **kwargs pass-thru to engine.transaction(func) allowing easier
1191a632fa11SMike Bayercreation of transactionalizing decorator functions
1192a632fa11SMike Bayer- added iterator interface to ResultProxy:  "for row in result:..."
1193a632fa11SMike Bayer- added assertion to tx = session.begin(); tx.rollback(); tx.begin(), i.e. cant
1194a632fa11SMike Bayeruse it after a rollback()
1195a632fa11SMike Bayer- added date conversion on bind parameter fix to SQLite enabling dates to
1196a632fa11SMike Bayerwork with pysqlite1
1197a632fa11SMike Bayer- improvements to subqueries to more intelligently construct their FROM
1198a632fa11SMike Bayerclauses [ticket:116]
1199a632fa11SMike Bayer- added PickleType to types.
1200a632fa11SMike Bayer- fixed two bugs with column labels with regards to bind parameters: bind param
1201a632fa11SMike Bayerkeynames they are now generated from a column "label" in all relevant cases to
1202a632fa11SMike Bayertake advantage of excess-name-length rules, and checks for a peculiar collision
1203a632fa11SMike Bayeragainst a column named the same as "tablename_colname" added
1204a632fa11SMike Bayer- major overhaul to unit of work documentation, other documentation sections.
1205bbf9f191SMike Bayer- fixed attributes bug where if an object is committed, its lazy-loaded list got 
1206bbf9f191SMike Bayerblown away if it hadnt been loaded
1207a632fa11SMike Bayer- added unique_connection() method to engine, connection pool to return a
1208a632fa11SMike Bayerconnection that is not part of the thread-local context or any current
1209a632fa11SMike Bayertransaction
1210a632fa11SMike Bayer- added invalidate() function to pooled connection.  will remove the connection
1211a632fa11SMike Bayerfrom the pool.  still need work for engines to auto-reconnect to a stale DB
1212a632fa11SMike Bayerthough.
1213a632fa11SMike Bayer- added distinct() function to column elements so you can do
1214a632fa11SMike Bayerfunc.count(mycol.distinct())
1215a632fa11SMike Bayer- added "always_refresh" flag to Mapper, creates a mapper that will always
1216a632fa11SMike Bayerrefresh the attributes of objects it gets/selects from the DB, overwriting any
1217a632fa11SMike Bayerchanges made.
1218bbf9f191SMike Bayer
1219b5060e88SMike Bayer0.1.4
1220a632fa11SMike Bayer- create_engine() now uses genericized parameters; host/hostname,
1221a632fa11SMike Bayerdb/dbname/database, password/passwd, etc. for all engine connections. makes
1222a632fa11SMike Bayer engine URIs much more "universal"
1223a632fa11SMike Bayer- added support for SELECT statements embedded into a column clause, using the
1224a632fa11SMike Bayerflag "scalar=True"
1225c5e1abc7SMike Bayer- another overhaul to EagerLoading when used in conjunction with mappers that
1226c5e1abc7SMike Bayerinherit; improvements to eager loads figuring out their aliased queries
1227c5e1abc7SMike Bayercorrectly, also relations set up against a mapper with inherited mappers will
1228c5e1abc7SMike Bayercreate joins against the table that is specific to the mapper itself (i.e. and
1229c5e1abc7SMike Bayernot any tables that are inherited/are further down the inheritance chain),
1230c5e1abc7SMike Bayerthis can be overridden by using custom primary/secondary joins.
123116d21f64SMike Bayer- added J.Ellis patch to mapper.py so that selectone() throws an exception 
123216d21f64SMike Bayerif query returns more than one object row, selectfirst() to not throw the 
123316d21f64SMike Bayerexception. also adds selectfirst_by (synonymous with get_by) and selectone_by
1234c5e1abc7SMike Bayer- added onupdate parameter to Column, will exec SQL/python upon an update
1235c5e1abc7SMike Bayerstatement.Also adds "for_update=True" to all DefaultGenerator subclasses
1236c081749aSMike Bayer- added support for Oracle table reflection contributed by Andrija Zaric; 
1237c081749aSMike Bayerstill some bugs to work out regarding composite primary keys/dictionary selection
1238c5e1abc7SMike Bayer- checked in an initial Firebird module, awaiting testing.
1239c5e1abc7SMike Bayer- added sql.ClauseParameters dictionary object as the result for 
1240c5e1abc7SMike Bayercompiled.get_params(), does late-typeprocessing of bind parameters so 
1241c5e1abc7SMike Bayerthat the original values are easier to access
1242c5e1abc7SMike Bayer- more docs for indexes, column defaults, connection pooling, engine construction
1243a632fa11SMike Bayer- overhaul to the construction of the types system. uses a simpler inheritance
1244a632fa11SMike Bayerpattern so that any of the generic types can be easily subclassed, with no need
1245a632fa11SMike Bayerfor TypeDecorator.
1246a632fa11SMike Bayer- added "convert_unicode=False" parameter to SQLEngine, will cause all String
1247a632fa11SMike Bayertypes to perform unicode encoding/decoding (makes Strings act like Unicodes)
1248c5e1abc7SMike Bayer- added 'encoding="utf8"' parameter to engine.  the given encoding will be 
1249c5e1abc7SMike Bayerused for all encode/decode calls within Unicode types as well as Strings 
1250c5e1abc7SMike Bayerwhen convert_unicode=True.
1251c081749aSMike Bayer- improved support for mapping against UNIONs, added polymorph.py example
1252c081749aSMike Bayerto illustrate multi-class mapping against a UNION
1253c081749aSMike Bayer- fix to SQLite LIMIT/OFFSET syntax
1254c081749aSMike Bayer- fix to Oracle LIMIT syntax
1255c081749aSMike Bayer- added backref() function, allows backreferences to have keyword arguments
1256c081749aSMike Bayerthat will be passed to the backref.
1257c081749aSMike Bayer- Sequences and ColumnDefault objects can do execute()/scalar() standalone
1258c081749aSMike Bayer- SQL functions (i.e. func.foo()) can do execute()/scalar() standalone
1259c081749aSMike Bayer- fix to SQL functions so that the ANSI-standard functions, i.e. current_timestamp
1260c081749aSMike Bayeretc., do not specify parenthesis.  all other functions do.
1261c081749aSMike Bayer- added settattr_clean and append_clean to SmartProperty, which set 
1262c081749aSMike Bayerattributes without triggering a "dirty" event or any history. used as:
1263c081749aSMike Bayermyclass.prop1.setattr_clean(myobject, 'hi')
1264c5e1abc7SMike Bayer- improved support to column defaults when used by mappers; mappers will pull
1265c5e1abc7SMike Bayerpre-executed defaults from statement's executed bind parameters
1266c5e1abc7SMike Bayer(pre-conversion) to populate them into a saved object's attributes; if any
1267c5e1abc7SMike BayerPassiveDefaults have fired off, will instead post-fetch the row from the DB to
1268c5e1abc7SMike Bayerpopulate the object.
1269c5e1abc7SMike Bayer- added 'get_session().invalidate(*obj)' method to objectstore, instances will
1270c5e1abc7SMike Bayerrefresh() themselves upon the next attribute access.
1271c5e1abc7SMike Bayer- improvements to SQL func calls including an "engine" keyword argument so
1272c5e1abc7SMike Bayerthey can be execute()d or scalar()ed standalone, also added func accessor to
1273c5e1abc7SMike BayerSQLEngine
1274c081749aSMike Bayer- fix to MySQL4 custom table engines, i.e. TYPE instead of ENGINE
1275c081749aSMike Bayer- slightly enhanced logging, includes timestamps and a somewhat configurable
1276c081749aSMike Bayerformatting system, in lieu of a full-blown logging system
1277c081749aSMike Bayer- improvements to the ActiveMapper class from the TG gang, including
1278c081749aSMike Bayermany-to-many relationships
1279c081749aSMike Bayer- added Double and TinyInt support to mysql
1280b5060e88SMike Bayer
128149e3948dSMike Bayer0.1.3
1282c5e1abc7SMike Bayer- completed "post_update" feature, will add a second update statement before
1283c5e1abc7SMike Bayerinserts and after deletes in order to reconcile a relationship without any
1284c5e1abc7SMike Bayerdependencies being created; used when persisting two rows that are dependent
1285c5e1abc7SMike Bayeron each other
1286c5e1abc7SMike Bayer- completed mapper.using(session) function, localized per-object Session
1287c5e1abc7SMike Bayerfunctionality; objects can be declared and manipulated as local to any
1288c5e1abc7SMike Bayeruser-defined Session
1289d368fd17SMike Bayer- fix to Oracle "row_number over" clause with multiple tables
129049e3948dSMike Bayer- mapper.get() was not selecting multiple-keyed objects if the mapper's table was a join,
129149e3948dSMike Bayersuch as in an inheritance relationship, this is fixed.
129272dd2b08SMike Bayer- overhaul to sql/schema packages so that the sql package can run all on its own,
1293d368fd17SMike Bayerproducing selects, inserts, etc. without any engine dependencies.  builds upon
1294d368fd17SMike Bayernew TableClause/ColumnClause lexical objects.  Schema's Table/Column objects
1295d368fd17SMike Bayerare the "physical" subclasses of them.  simplifies schema/sql relationship,
1296d368fd17SMike Bayerextensions (like proxyengine), and speeds overall performance by a large margin. 
1297d368fd17SMike Bayerremoves the entire getattr() behavior that plagued 0.1.1.
1298d368fd17SMike Bayer- refactoring of how the mapper "synchronizes" data between two objects into a
1299d368fd17SMike Bayerseparate module, works better with properties attached to a mapper that has an 
1300d368fd17SMike Bayeradditional inheritance relationship to one of the related tables, also the same
1301d368fd17SMike Bayermethodology used to synchronize parent/child objects now used by mapper to
1302d368fd17SMike Bayersynchronize between inherited and inheriting mappers.
1303a9afbd89SMike Bayer- made objectstore "check for out-of-identitymap" more aggressive, will perform the
1304a9afbd89SMike Bayercheck when object attributes are modified or the object is deleted
1305d368fd17SMike Bayer- Index object fully implemented, can be constructed standalone, or via
1306d368fd17SMike Bayer"index" and "unique" arguments on Columns.
13078d298fa0SMike Bayer- added "convert_unicode" flag to SQLEngine, will treat all String/CHAR types
13088d298fa0SMike Bayeras Unicode types, with raw-byte/utf-8 translation on the bind parameter and 
13098d298fa0SMike Bayerresult set side.
1310fd856703SMike Bayer- postgres maintains a list of ANSI functions that must have no parenthesis so
1311fd856703SMike Bayerfunction calls with no arguments work consistently
1312413dcdf0SMike Bayer- tables can be created with no engine specified.  this will default their engine
1313413dcdf0SMike Bayerto a module-scoped "default engine" which is a ProxyEngine.  this engine can 
1314413dcdf0SMike Bayerbe connected via the function "global_connect".
1315ecebb7cdSMike Bayer- added "refresh(*obj)" method to objectstore / Session to reload the attributes of
1316ecebb7cdSMike Bayerany set of objects from the database unconditionally
13179395ebdfSMike Bayer
131894ac0521SMike Bayer0.1.2
131994ac0521SMike Bayer- fixed a recursive call in schema that was somehow running 994 times then returning
132094ac0521SMike Bayernormally.  broke nothing, slowed down everything.  thanks to jpellerin for finding this.
1321466e98a5SMike Bayer
1322e77a9d67SMike Bayer0.1.1
132369529025SMike Bayer- small fix to Function class so that expressions with a func.foo() use the type of the
132469529025SMike BayerFunction object (i.e. the left side) as the type of the boolean expression, not the 
132569529025SMike Bayerother side which is more of a moving target (changeset 1020).
132669529025SMike Bayer- creating self-referring mappers with backrefs slightly easier (but still not that easy -
132769529025SMike Bayerchangeset 1019)
132869529025SMike Bayer- fixes to one-to-one mappings (changeset 1015)
132969529025SMike Bayer- psycopg1 date/time issue with None fixed (changeset 1005)
133069529025SMike Bayer- two issues related to postgres, which doesnt want to give you the "lastrowid"
133169529025SMike Bayersince oids are deprecated:
133269529025SMike Bayer   * postgres database-side defaults that are on primary key cols *do* execute 
133369529025SMike Bayerexplicitly beforehand, even though thats not the idea of a PassiveDefault.  this is
133469529025SMike Bayerbecause sequences on columns get reflected as PassiveDefaults, but need to be explicitly
133569529025SMike Bayerexecuted on a primary key col so we know what we just inserted.  
133669529025SMike Bayer   * if you did add a row that has a bunch of database-side defaults on it, 
133769529025SMike Bayerand the PassiveDefault thing was working the old way, i.e. they just execute on 
133869529025SMike Bayerthe DB side, the "cant get the row back without an OID" exception that occurred
133969529025SMike Bayeralso will not happen unless someone (usually the ORM) explicitly asks for it.
134069529025SMike Bayer- fixed a glitch with engine.execute_compiled where it was making a second 
134169529025SMike BayerResultProxy that just got thrown away.
134269529025SMike Bayer- began to implement newer logic in object properities.  you can now say
134369529025SMike Bayermyclass.attr.property, which will give you the PropertyLoader corresponding to that
134469529025SMike Bayerattribute, i.e. myclass.mapper.props['attr']
134569529025SMike Bayer- eager loading has been internally overhauled to use aliases at all times.  more 
134669529025SMike Bayercomplicated chains of eager loads can now be created without any need for explicit
134769529025SMike Bayer"use aliases"-type instructions.  EagerLoader code is also much simpler now.
134869529025SMike Bayer- a new somewhat experimental flag "use_update" added to relations, indicates that 
134969529025SMike Bayerthis relationship should be handled by a second UPDATE statement, either after a 
135069529025SMike Bayerprimary INSERT or before a primary DELETE.  handles circular row dependencies.
1351bca0afa1SMike Bayer- added exceptions module, all raised exceptions (except for some 
1352bca0afa1SMike BayerKeyError/AttributeError exceptions) descend from these classes.
1353e77a9d67SMike Bayer- fix to date types with MySQL, returned timedelta converted to datetime.time
1354bca0afa1SMike Bayer- two-phase objectstore.commit operations (i.e. begin/commit) now return a 
1355bca0afa1SMike Bayertransactional object (SessionTrans), to more clearly indicate transaction boundaries.
1356e77a9d67SMike Bayer- Index object with create/drop support added to schema
1357e77a9d67SMike Bayer- fix to postgres, where it will explicitly pre-execute a PassiveDefault on a table
1358e77a9d67SMike Bayerif it is a primary key column, pursuant to the ongoing "we cant get inserted rows 
1359e77a9d67SMike Bayerback from postgres" issue
1360e77a9d67SMike Bayer- change to information_schema query that gets back postgres table defs, now
1361e77a9d67SMike Bayeruses explicit JOIN keyword, since one user had faster performance with 8.1
1362e77a9d67SMike Bayer- fix to engine.process_defaults so it works correctly with a table that has 
1363e77a9d67SMike Bayerdifferent column name/column keys (changset 982)
1364e77a9d67SMike Bayer- a column can only be attached to one table - this is now asserted
1365e77a9d67SMike Bayer- postgres time types descend from Time type
1366e77a9d67SMike Bayer- fix to alltests so that it runs types test (now named testtypes)
1367e77a9d67SMike Bayer- fix to Join object so that it correctly exports its foreign keys (cs 973)
1368e77a9d67SMike Bayer- creating relationships against mappers that use inheritance fixed (cs 973)
1369e77a9d67SMike Bayer
1370e77a9d67SMike Bayer0.1.0
1371880c2199SMike Bayerinitial release
1372880c2199SMike Bayer
13730a092566SRick Morrison
1374