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