1
2=============
30.2 Changelog
4=============
5
6
7.. changelog::
8    :version: 0.2.8
9    :released: Tue Sep 05 2006
10
11    .. change::
12        :tags:
13        :tickets:
14
15      cleanup on connection methods + documentation.  custom DBAPI
16      arguments specified in query string, 'connect_args' argument
17      to 'create_engine', or custom creation function via 'creator'
18      function to 'create_engine'.
19
20    .. change::
21        :tags:
22        :tickets: 274
23
24      added "recycle" argument to Pool, is "pool_recycle" on create_engine,
25      defaults to 3600 seconds; connections after this age will be closed and
26      replaced with a new one, to handle db's that automatically close
27      stale connections
28
29    .. change::
30        :tags:
31        :tickets: 121
32
33      changed "invalidate" semantics with pooled connection; will
34      instruct the underlying connection record to reconnect the next
35      time its called.  "invalidate" will also automatically be called
36      if any error is thrown in the underlying call to connection.cursor().
37      this will hopefully allow the connection pool to reconnect to a
38      database that had been stopped and started without restarting
39      the connecting application
40
41    .. change::
42        :tags:
43        :tickets:
44
45      eesh !  the tutorial doctest was broken for quite some time.
46
47    .. change::
48        :tags:
49        :tickets:
50
51      add_property() method on mapper does a "compile all mappers"
52      step in case the given property references a non-compiled mapper
53      (as it did in the case of the tutorial !)
54
55    .. change::
56        :tags:
57        :tickets: 277
58
59      check for pg sequence already existing before create
60
61    .. change::
62        :tags:
63        :tickets:
64
65      if a contextual session is established via MapperExtension.get_session
66      (as it is using the sessioncontext plugin, etc), a lazy load operation
67      will use that session by default if the parent object is not
68      persistent with a session already.
69
70    .. change::
71        :tags:
72        :tickets:
73
74      lazy loads will not fire off for an object that does not have a
75      database identity (why?
76      see https://www.sqlalchemy.org/trac/wiki/WhyDontForeignKeysLoadData)
77
78    .. change::
79        :tags:
80        :tickets:
81
82      unit-of-work does a better check for "orphaned" objects that are
83      part of a "delete-orphan" cascade, for certain conditions where the
84      parent isn't available to cascade from.
85
86    .. change::
87        :tags:
88        :tickets:
89
90      mappers can tell if one of their objects is an "orphan" based
91      on interactions with the attribute package. this check is based
92      on a status flag maintained for each relationship
93      when objects are attached and detached from each other.
94
95    .. change::
96        :tags:
97        :tickets:
98
99      it is now invalid to declare a self-referential relationship with
100      "delete-orphan" (as the abovementioned check would make them impossible
101      to save)
102
103    .. change::
104        :tags:
105        :tickets:
106
107      improved the check for objects being part of a session when the
108      unit of work seeks to flush() them as part of a relationship..
109
110    .. change::
111        :tags:
112        :tickets: 280
113
114      statement execution supports using the same BindParam
115      object more than once in an expression; simplified handling of positional
116      parameters.  nice job by Bill Noon figuring out the basic idea.
117
118    .. change::
119        :tags:
120        :tickets: 60, 71
121
122      postgres reflection moved to use pg_schema tables, can be overridden
123      with use_information_schema=True argument to create_engine.
124
125    .. change::
126        :tags:
127        :tickets: 155
128
129      added case_sensitive argument to MetaData, Table, Column, determines
130      itself automatically based on if a parent schemaitem has a non-None
131      setting for the flag, or if not, then whether the identifier name is all lower
132      case or not.  when set to True, quoting is applied to identifiers with mixed or
133      uppercase identifiers.  quoting is also applied automatically in all cases to
134      identifiers that are known to be reserved words or contain other non-standard
135      characters. various database dialects can override all of this behavior, but
136      currently they are all using the default behavior.  tested with postgres, mysql,
137      sqlite, oracle.  needs more testing with firebird, ms-sql. part of the ongoing
138      work with
139
140    .. change::
141        :tags:
142        :tickets:
143
144      unit tests updated to run without any pysqlite installed; pool
145      test uses a mock DBAPI
146
147    .. change::
148        :tags:
149        :tickets: 281
150
151      urls support escaped characters in passwords
152
153    .. change::
154        :tags:
155        :tickets:
156
157      added limit/offset to UNION queries (though not yet in oracle)
158
159    .. change::
160        :tags:
161        :tickets:
162
163      added "timezone=True" flag to DateTime and Time types.  postgres
164      so far will convert this to "TIME[STAMP] (WITH|WITHOUT) TIME ZONE",
165      so that control over timezone presence is more controllable (psycopg2
166      returns datetimes with tzinfo's if available, which can create confusion
167      against datetimes that don't).
168
169    .. change::
170        :tags:
171        :tickets: 287
172
173      fix to using query.count() with distinct, \**kwargs with SelectResults
174      count()
175
176    .. change::
177        :tags:
178        :tickets: 289
179
180      deregister Table from MetaData when autoload fails;
181
182    .. change::
183        :tags:
184        :tickets: 293
185
186      import of py2.5s sqlite3
187
188    .. change::
189        :tags:
190        :tickets: 296
191
192      unicode fix for startswith()/endswith()
193
194.. changelog::
195    :version: 0.2.7
196    :released: Sat Aug 12 2006
197
198    .. change::
199        :tags:
200        :tickets:
201
202      quoting facilities set up so that database-specific quoting can be
203      turned on for individual table, schema, and column identifiers when
204      used in all queries/creates/drops.  Enabled via "quote=True" in
205      Table or Column, as well as "quote_schema=True" in Table.  Thanks to
206      Aaron Spike for the excellent efforts.
207
208    .. change::
209        :tags:
210        :tickets:
211
212      assignmapper was setting is_primary=True, causing all sorts of mayhem
213      by not raising an error when redundant mappers were set up, fixed
214
215    .. change::
216        :tags:
217        :tickets:
218
219      added allow_null_pks option to Mapper, allows rows where some
220      primary key columns are null (i.e. when mapping to outer joins etc)
221
222    .. change::
223        :tags:
224        :tickets:
225
226      modification to unitofwork to not maintain ordering within the
227      "new" list or within the UOWTask "objects" list; instead, new objects
228      are tagged with an ordering identifier as they are registered as new
229      with the session, and the INSERT statements are then sorted within the
230      mapper save_obj.  the INSERT ordering has basically been pushed all
231      the way to the end of the flush cycle. that way the various sorts and
232      organizations occurring within UOWTask (particularly the circular task
233      sort) don't have to worry about maintaining order (which they weren't anyway)
234
235    .. change::
236        :tags:
237        :tickets:
238
239      fixed reflection of foreign keys to autoload the referenced table
240      if it was not loaded already
241
242    .. change::
243        :tags:
244        :tickets: 256
245
246      - pass URL query string arguments to connect() function
247
248    .. change::
249        :tags:
250        :tickets: 257
251
252      - oracle boolean type
253
254    .. change::
255        :tags:
256        :tickets:
257
258      custom primary/secondary join conditions in a relation *will* be propagated
259      to backrefs by default.  specifying a backref() will override this behavior.
260
261    .. change::
262        :tags:
263        :tickets:
264
265      better check for ambiguous join conditions in sql.Join; propagates to a
266      better error message in PropertyLoader (i.e. relation()/backref()) for when
267      the join condition can't be reasonably determined.
268
269    .. change::
270        :tags:
271        :tickets:
272
273      sqlite creates ForeignKeyConstraint objects properly upon table
274      reflection.
275
276    .. change::
277        :tags:
278        :tickets: 224
279
280      adjustments to pool stemming from changes made for.
281      overflow counter should only be decremented if the connection actually
282      succeeded.  added a test script to attempt testing this.
283
284    .. change::
285        :tags:
286        :tickets:
287
288      fixed mysql reflection of default values to be PassiveDefault
289
290    .. change::
291        :tags:
292        :tickets: 263, 264
293
294      added reflected 'tinyint', 'mediumint' type to MS-SQL.
295
296    .. change::
297        :tags:
298        :tickets:
299
300      SingletonThreadPool has a size and does a cleanup pass, so that
301      only a given number of thread-local connections stay around (needed
302      for sqlite applications that dispose of threads en masse)
303
304    .. change::
305        :tags:
306        :tickets: 267, 265
307
308      fixed small pickle bug(s) with lazy loaders
309
310    .. change::
311        :tags:
312        :tickets:
313
314      fixed possible error in mysql reflection where certain versions
315      return an array instead of string for SHOW CREATE TABLE call
316
317    .. change::
318        :tags:
319        :tickets: 1770
320
321      fix to lazy loads when mapping to joins
322
323    .. change::
324        :tags:
325        :tickets:
326
327      all create()/drop() calls have a keyword argument of "connectable".
328      "engine" is deprecated.
329
330    .. change::
331        :tags:
332        :tickets:
333
334      fixed ms-sql connect() to work with adodbapi
335
336    .. change::
337        :tags:
338        :tickets:
339
340      added "nowait" flag to Select()
341
342    .. change::
343        :tags:
344        :tickets: 271
345
346      inheritance check uses issubclass() instead of direct __mro__ check
347      to make sure class A inherits from B, allowing mapper inheritance to more
348      flexibly correspond to class inheritance
349
350    .. change::
351        :tags:
352        :tickets: 252
353
354      SelectResults will use a subselect, when calling an aggregate (i.e.
355      max, min, etc.) on a SelectResults that has an ORDER BY clause
356
357    .. change::
358        :tags:
359        :tickets: 269
360
361      fixes to types so that database-specific types more easily used;
362      fixes to mysql text types to work with this methodology
363
364    .. change::
365        :tags:
366        :tickets:
367
368      some fixes to sqlite date type organization
369
370    .. change::
371        :tags:
372        :tickets: 263
373
374      added MSTinyInteger to MS-SQL
375
376.. changelog::
377    :version: 0.2.6
378    :released: Thu Jul 20 2006
379
380    .. change::
381        :tags:
382        :tickets: 76
383
384      big overhaul to schema to allow truly composite primary and foreign
385      key constraints, via new ForeignKeyConstraint and PrimaryKeyConstraint
386      objects.
387      Existing methods of primary/foreign key creation have not been changed
388      but use these new objects behind the scenes.  table creation
389      and reflection is now more table oriented rather than column oriented.
390
391    .. change::
392        :tags:
393        :tickets:
394
395      overhaul to MapperExtension calling scheme, wasn't working very well
396      previously
397
398    .. change::
399        :tags:
400        :tickets:
401
402      tweaks to ActiveMapper, supports self-referential relationships
403
404    .. change::
405        :tags:
406        :tickets:
407
408      slight rearrangement to objectstore (in activemapper/threadlocal)
409      so that the SessionContext is referenced by '.context' instead
410      of subclassed directly.
411
412    .. change::
413        :tags:
414        :tickets:
415
416      activemapper will use threadlocal's objectstore if the mod is
417      activated when activemapper is imported
418
419    .. change::
420        :tags:
421        :tickets:
422
423      small fix to URL regexp to allow filenames with '@' in them
424
425    .. change::
426        :tags:
427        :tickets:
428
429      fixes to Session expunge/update/etc...needs more cleanup.
430
431    .. change::
432        :tags:
433        :tickets:
434
435      select_table mappers *still* weren't always compiling
436
437    .. change::
438        :tags:
439        :tickets:
440
441      fixed up Boolean datatype
442
443    .. change::
444        :tags:
445        :tickets:
446
447      added count()/count_by() to list of methods proxied by assignmapper;
448      this also adds them to activemapper
449
450    .. change::
451        :tags:
452        :tickets:
453
454      connection exceptions wrapped in DBAPIError
455
456    .. change::
457        :tags:
458        :tickets:
459
460      ActiveMapper now supports autoloading column definitions from the
461      database if you supply a __autoload__ = True attribute in your
462      mapping inner-class.  Currently this does not support reflecting
463      any relationships.
464
465    .. change::
466        :tags:
467        :tickets:
468
469      deferred column load could screw up the connection status in
470      a flush() under some circumstances, this was fixed
471
472    .. change::
473        :tags:
474        :tickets:
475
476      expunge() was not working with cascade, fixed.
477
478    .. change::
479        :tags:
480        :tickets:
481
482      potential endless loop in cascading operations fixed.
483
484    .. change::
485        :tags:
486        :tickets:
487
488      added "synonym()" function, applied to properties to have a
489      propname the same as another, for the purposes of overriding props
490      and allowing the original propname to be accessible in select_by().
491
492    .. change::
493        :tags:
494        :tickets:
495
496      fix to typing in clause construction which specifically helps
497      type issues with polymorphic_union (CAST/ColumnClause propagates
498      its type to proxy columns)
499
500    .. change::
501        :tags:
502        :tickets:
503
504      mapper compilation work ongoing, someday it'll work....moved
505      around the initialization of MapperProperty objects to be after
506      all mappers are created to better handle circular compilations.
507      do_init() method is called on all properties now which are more
508      aware of their "inherited" status if so.
509
510    .. change::
511        :tags:
512        :tickets:
513
514      eager loads explicitly disallowed on self-referential relationships, or
515      relationships to an inheriting mapper (which is also self-referential)
516
517    .. change::
518        :tags:
519        :tickets: 244
520
521      reduced bind param size in query._get to appease the picky oracle
522
523    .. change::
524        :tags:
525        :tickets: 234
526
527      added 'checkfirst' argument to table.create()/table.drop(), as
528      well as table.exists()
529
530    .. change::
531        :tags:
532        :tickets: 245
533
534      some other ongoing fixes to inheritance
535
536    .. change::
537        :tags:
538        :tickets:
539
540      attribute/backref/orphan/history-tracking tweaks as usual...
541
542.. changelog::
543    :version: 0.2.5
544    :released: Sat Jul 08 2006
545
546    .. change::
547        :tags:
548        :tickets:
549
550      fixed endless loop bug in select_by(), if the traversal hit
551      two mappers that referenced each other
552
553    .. change::
554        :tags:
555        :tickets:
556
557      upgraded all unittests to insert './lib/' into sys.path,
558      working around new setuptools PYTHONPATH-killing behavior
559
560    .. change::
561        :tags:
562        :tickets:
563
564      further fixes with attributes/dependencies/etc....
565
566    .. change::
567        :tags:
568        :tickets:
569
570      improved error handling for when DynamicMetaData is not connected
571
572    .. change::
573        :tags:
574        :tickets:
575
576      MS-SQL support largely working (tested with pymssql)
577
578    .. change::
579        :tags:
580        :tickets:
581
582      ordering of UPDATE and DELETE statements within groups is now
583      in order of primary key values, for more deterministic ordering
584
585    .. change::
586        :tags:
587        :tickets:
588
589      after_insert/delete/update mapper extensions now called per object,
590      not per-object-per-table
591
592    .. change::
593        :tags:
594        :tickets:
595
596      further fixes/refactorings to mapper compilation
597
598.. changelog::
599    :version: 0.2.4
600    :released: Tue Jun 27 2006
601
602    .. change::
603        :tags:
604        :tickets:
605
606      try/except when the mapper sets init.__name__ on a mapped class,
607      supports python 2.3
608
609    .. change::
610        :tags:
611        :tickets:
612
613      fixed bug where threadlocal engine would still autocommit
614      despite a transaction in progress
615
616    .. change::
617        :tags:
618        :tickets:
619
620      lazy load and deferred load operations require the parent object
621      to be in a Session to do the operation; whereas before the operation
622      would just return a blank list or None, it now raises an exception.
623
624    .. change::
625        :tags:
626        :tickets:
627
628      Session.update() is slightly more lenient if the session to which
629      the given object was formerly attached to was garbage collected;
630      otherwise still requires you explicitly remove the instance from
631      the previous Session.
632
633    .. change::
634        :tags:
635        :tickets:
636
637      fixes to mapper compilation, checking for more error conditions
638
639    .. change::
640        :tags:
641        :tickets:
642
643      small fix to eager loading combined with ordering/limit/offset
644
645    .. change::
646        :tags:
647        :tickets: 206
648
649      utterly remarkable:  added a single space between 'CREATE TABLE'
650      and '(<the rest of it>' since *that's how MySQL indicates a non-
651      reserved word tablename.....*
652
653    .. change::
654        :tags:
655        :tickets:
656
657      more fixes to inheritance, related to many-to-many relations
658      properly saving
659
660    .. change::
661        :tags:
662        :tickets:
663
664      fixed bug when specifying explicit module to mysql dialect
665
666    .. change::
667        :tags:
668        :tickets:
669
670      when QueuePool times out it raises a TimeoutError instead of
671      erroneously making another connection
672
673    .. change::
674        :tags:
675        :tickets:
676
677      Queue.Queue usage in pool has been replaced with a locally
678      modified version (works in py2.3/2.4!) that uses a threading.RLock
679      for a mutex.  this is to fix a reported case where a ConnectionFairy's
680      __del__() method got called within the Queue's get() method, which
681      then returns its connection to the Queue via the put() method,
682      causing a reentrant hang unless threading.RLock is used.
683
684    .. change::
685        :tags:
686        :tickets:
687
688      postgres will not place SERIAL keyword on a primary key column
689      if it has a foreign key constraint
690
691    .. change::
692        :tags:
693        :tickets: 221
694
695      cursor() method on ConnectionFairy allows db-specific extension
696      arguments to be propagated
697
698    .. change::
699        :tags:
700        :tickets: 225
701
702      lazy load bind params properly propagate column type
703
704    .. change::
705        :tags:
706        :tickets:
707
708      new MySQL types: MSEnum, MSTinyText, MSMediumText, MSLongText, etc.
709      more support for MS-specific length/precision params in numeric types
710      patch courtesy Mike Bernson
711
712    .. change::
713        :tags:
714        :tickets: 224
715
716      some fixes to connection pool invalidate()
717
718.. changelog::
719    :version: 0.2.3
720    :released: Sat Jun 17 2006
721
722    .. change::
723        :tags:
724        :tickets:
725
726      overhaul to mapper compilation to be deferred.  this allows mappers
727      to be constructed in any order, and their relationships to each
728      other are compiled when the mappers are first used.
729
730    .. change::
731        :tags:
732        :tickets:
733
734      fixed a pretty big speed bottleneck in cascading behavior particularly
735      when backrefs were in use
736
737    .. change::
738        :tags:
739        :tickets:
740
741      the attribute instrumentation module has been completely rewritten; its
742      now a large degree simpler and clearer, slightly faster.  the "history"
743      of an attribute is no longer micromanaged with each change and is
744      instead part of a "CommittedState" object created when the
745      instance is first loaded.  HistoryArraySet is gone, the behavior of
746      list attributes is now more open ended (i.e. they're not sets anymore).
747
748    .. change::
749        :tags:
750        :tickets:
751
752      py2.4 "set" construct used internally, falls back to sets.Set when
753      "set" not available/ordering is needed.
754
755    .. change::
756        :tags:
757        :tickets:
758
759      fix to transaction control, so that repeated rollback() calls
760      don't fail (was failing pretty badly when flush() would raise
761      an exception in a larger try/except transaction block)
762
763    .. change::
764        :tags:
765        :tickets: 151
766
767      "foreignkey" argument to relation() can also be a list.  fixed
768      auto-foreignkey detection
769
770    .. change::
771        :tags:
772        :tickets:
773
774      fixed bug where tables with schema names weren't getting indexed in
775      the MetaData object properly
776
777    .. change::
778        :tags:
779        :tickets: 207
780
781      fixed bug where Column with redefined "key" property wasn't getting
782      type conversion happening in the ResultProxy
783
784    .. change::
785        :tags:
786        :tickets:
787
788      fixed 'port' attribute of URL to be an integer if present
789
790    .. change::
791        :tags:
792        :tickets:
793
794      fixed old bug where if a many-to-many table mapped as "secondary"
795      had extra columns, delete operations didn't work
796
797    .. change::
798        :tags:
799        :tickets:
800
801      bugfixes for mapping against UNION queries
802
803    .. change::
804        :tags:
805        :tickets:
806
807      fixed incorrect exception class thrown when no DB driver present
808
809    .. change::
810        :tags:
811        :tickets: 138
812
813      added NonExistentTable exception thrown when reflecting a table
814      that doesn't exist
815
816    .. change::
817        :tags:
818        :tickets:
819
820      small fix to ActiveMapper regarding one-to-one backrefs, other
821      refactorings
822
823    .. change::
824        :tags:
825        :tickets:
826
827      overridden constructor in mapped classes gets __name__ and
828      __doc__ from the original class
829
830    .. change::
831        :tags:
832        :tickets: 200
833
834      fixed small bug in selectresult.py regarding mapper extension
835
836    .. change::
837        :tags:
838        :tickets:
839
840      small tweak to cascade_mappers, not very strongly supported
841      function at the moment
842
843    .. change::
844        :tags:
845        :tickets: 202
846
847      some fixes to between(), column.between() to propagate typing
848      information better
849
850    .. change::
851        :tags:
852        :tickets: 203
853
854      if an object fails to be constructed, is not added to the
855      session
856
857    .. change::
858        :tags:
859        :tickets:
860
861      CAST function has been made into its own clause object with
862      its own compilation function in ansicompiler; allows MySQL
863      to silently ignore most CAST calls since MySQL
864      seems to only support the standard CAST syntax with Date types.
865      MySQL-compatible CAST support for strings, ints, etc. a TODO
866
867.. changelog::
868    :version: 0.2.2
869    :released: Mon Jun 05 2006
870
871    .. change::
872        :tags:
873        :tickets: 190
874
875      big improvements to polymorphic inheritance behavior, enabling it
876      to work with adjacency list table structures
877
878    .. change::
879        :tags:
880        :tickets:
881
882      major fixes and refactorings to inheritance relationships overall,
883      more unit tests
884
885    .. change::
886        :tags:
887        :tickets:
888
889      fixed "echo_pool" flag on create_engine()
890
891    .. change::
892        :tags:
893        :tickets:
894
895      fix to docs, removed incorrect info that close() is unsafe to use
896      with threadlocal strategy (its totally safe !)
897
898    .. change::
899        :tags:
900        :tickets: 188
901
902      create_engine() can take URLs as string or unicode
903
904    .. change::
905        :tags:
906        :tickets:
907
908      firebird support partially completed;
909      thanks to James Ralston and Brad Clements for their efforts.
910
911    .. change::
912        :tags:
913        :tickets:
914
915      Oracle url translation was broken, fixed, will feed host/port/sid
916      into cx_oracle makedsn() if 'database' field is present, else uses
917      straight TNS name from the 'host' field
918
919    .. change::
920        :tags:
921        :tickets:
922
923      fix to using unicode criterion for query.get()/query.load()
924
925    .. change::
926        :tags:
927        :tickets:
928
929      count() function on selectables now uses table primary key or
930      first column instead of "1" for criterion, also uses label "rowcount"
931      instead of "count".
932
933    .. change::
934        :tags:
935        :tickets:
936
937      got rudimental "mapping to multiple tables" functionality cleaned up,
938      more correctly documented
939
940    .. change::
941        :tags:
942        :tickets:
943
944      restored global_connect() function, attaches to a DynamicMetaData
945      instance called "default_metadata".  leaving MetaData arg to Table
946      out will use the default metadata.
947
948    .. change::
949        :tags:
950        :tickets:
951
952      fixes to session cascade behavior, entity_name propagation
953
954    .. change::
955        :tags:
956        :tickets:
957
958      reorganized unittests into subdirectories
959
960    .. change::
961        :tags:
962        :tickets:
963
964      more fixes to threadlocal connection nesting patterns
965
966.. changelog::
967    :version: 0.2.1
968    :released: Mon May 29 2006
969
970    .. change::
971        :tags:
972        :tickets:
973
974      "pool" argument to create_engine() properly propagates
975
976    .. change::
977        :tags:
978        :tickets:
979
980      fixes to URL, raises exception if not parsed, does not pass blank
981      fields along to the DB connect string (a string such as
982      user:host@/db was breaking on postgres)
983
984    .. change::
985        :tags:
986        :tickets:
987
988      small fixes to Mapper when it inserts and tries to get
989      new primary key values back
990
991    .. change::
992        :tags:
993        :tickets:
994
995      rewrote half of TLEngine, the ComposedSQLEngine used with
996      'strategy="threadlocal"'.  it now properly implements engine.begin()/
997      engine.commit(), which nest fully with connection.begin()/trans.commit().
998      added about six unittests.
999
1000    .. change::
1001        :tags:
1002        :tickets:
1003
1004      major "duh" in pool.Pool, forgot to put back the WeakValueDictionary.
1005      unittest which was supposed to check for this was also silently missing
1006      it.  fixed unittest to ensure that ConnectionFairy properly falls out
1007      of scope.
1008
1009    .. change::
1010        :tags:
1011        :tickets:
1012
1013      placeholder dispose() method added to SingletonThreadPool, doesn't
1014      do anything yet
1015
1016    .. change::
1017        :tags:
1018        :tickets:
1019
1020      rollback() is automatically called when an exception is raised,
1021      but only if there's no transaction in process (i.e. works more like
1022      autocommit).
1023
1024    .. change::
1025        :tags:
1026        :tickets:
1027
1028      fixed exception raise in sqlite if no sqlite module present
1029
1030    .. change::
1031        :tags:
1032        :tickets:
1033
1034      added extra example detail for association object doc
1035
1036    .. change::
1037        :tags:
1038        :tickets:
1039
1040      Connection adds checks for already being closed
1041
1042.. changelog::
1043    :version: 0.2.0
1044    :released: Sat May 27 2006
1045
1046    .. change::
1047        :tags:
1048        :tickets:
1049
1050      overhaul to Engine system so that what was formerly the SQLEngine
1051      is now a ComposedSQLEngine which consists of a variety of components,
1052      including a Dialect, ConnectionProvider, etc. This impacted all the
1053      db modules as well as Session and Mapper.
1054
1055    .. change::
1056        :tags:
1057        :tickets:
1058
1059      create_engine now takes only RFC-1738-style strings:
1060      driver://user:password@host:port/database
1061
1062    .. change::
1063        :tags:
1064        :tickets: 152
1065
1066      total rewrite of connection-scoping methodology, Connection objects
1067      can now execute clause elements directly, added explicit "close" as
1068      well as support throughout Engine/ORM to handle closing properly,
1069      no longer relying upon __del__ internally to return connections
1070      to the pool.
1071
1072    .. change::
1073        :tags:
1074        :tickets:
1075
1076      overhaul to Session interface and scoping.  uses hibernate-style
1077      methods, including query(class), save(), save_or_update(), etc.
1078      no threadlocal scope is installed by default.  Provides a binding
1079      interface to specific Engines and/or Connections so that underlying
1080      Schema objects do not need to be bound to an Engine.  Added a basic
1081      SessionTransaction object that can simplistically aggregate transactions
1082      across multiple engines.
1083
1084    .. change::
1085        :tags:
1086        :tickets:
1087
1088      overhaul to mapper's dependency and "cascade" behavior; dependency logic
1089      factored out of properties.py into a separate module "dependency.py".
1090      "cascade" behavior is now explicitly controllable, proper implementation
1091      of "delete", "delete-orphan", etc.  dependency system can now determine at
1092      flush time if a child object has a parent or not so that it makes better
1093      decisions on how that child should be updated in the DB with regards to deletes.
1094
1095    .. change::
1096        :tags:
1097        :tickets:
1098
1099      overhaul to Schema to build upon MetaData object instead of an Engine.
1100      Entire SQL/Schema system can be used with no Engines whatsoever, executed
1101      solely by an explicit Connection object.  the "bound" methodology exists via the
1102      BoundMetaData for schema objects.  ProxyEngine is generally not needed
1103      anymore and is replaced by DynamicMetaData.
1104
1105    .. change::
1106        :tags:
1107        :tickets: 167
1108
1109      true polymorphic behavior implemented, fixes
1110
1111    .. change::
1112        :tags:
1113        :tickets: 147
1114
1115      "oid" system has been totally moved into compile-time behavior;
1116      if they are used in an order_by where they are not available, the order_by
1117      doesn't get compiled, fixes
1118
1119    .. change::
1120        :tags:
1121        :tickets:
1122
1123      overhaul to packaging; "mapping" is now "orm", "objectstore" is now
1124      "session", the old "objectstore" namespace gets loaded in via the
1125      "threadlocal" mod if used
1126
1127    .. change::
1128        :tags:
1129        :tickets:
1130
1131      mods now called in via "import <modname>".  extensions favored over
1132      mods as mods are globally-monkeypatching
1133
1134    .. change::
1135        :tags:
1136        :tickets: 154
1137
1138      fix to add_property so that it propagates properties to inheriting
1139      mappers
1140
1141    .. change::
1142        :tags:
1143        :tickets:
1144
1145      backrefs create themselves against primary mapper of its originating
1146      property, primary/secondary join arguments can be specified to override.
1147      helps their usage with polymorphic mappers
1148
1149    .. change::
1150        :tags:
1151        :tickets: 31
1152
1153      "table exists" function has been implemented
1154
1155    .. change::
1156        :tags:
1157        :tickets: 98
1158
1159      "create_all/drop_all" added to MetaData object
1160
1161    .. change::
1162        :tags:
1163        :tickets:
1164
1165      improvements and fixes to topological sort algorithm, as well as more
1166      unit tests
1167
1168    .. change::
1169        :tags:
1170        :tickets:
1171
1172      tutorial page added to docs which also can be run with a custom doctest
1173      runner to ensure its properly working.  docs generally overhauled to
1174      deal with new code patterns
1175
1176    .. change::
1177        :tags:
1178        :tickets:
1179
1180      many more fixes, refactorings.
1181
1182    .. change::
1183        :tags:
1184        :tickets:
1185
1186      migration guide is available on the Wiki at
1187      https://www.sqlalchemy.org/trac/wiki/02Migration
1188