Thread: [Sqlalchemy-commits] sqlalchemy: initial annotations approach to join conditions. al...
Brought to you by:
zzzeek
From: <co...@sq...> - 2012-04-24 23:23:09
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/f41aa3ad1da9 changeset: 8200:f41aa3ad1da9 user: Mike Bayer <mi...@zz...> date: Mon Feb 06 12:20:15 2012 -0500 description: initial annotations approach to join conditions. all tests pass, plus additional tests in #1401 pass. would now like to reorganize RelationshipProperty more around the annotations concept. Subject: sqlalchemy: proof of concept. relationships.JoinCondition is given details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/c20652a784a2 changeset: 8201:c20652a784a2 user: Mike Bayer <mi...@zz...> date: Mon Feb 06 14:48:03 2012 -0500 description: proof of concept. relationships.JoinCondition is given everything known about the relationship in an ORM-agnostic way. The primaryjoin is determined as before, but is then immediately parsed and annotated with "foreign", "local" and "remote" annotations. These annotations will then drive the additional decisions made, namely "direction" and "sync pairs". The end user will be able to pass a pre-annotated join condition in which case those annotations take effect as given, which will in one pass fix both #1401 as well as #610 (for #610, the "foreign" / "remote" annotation can recursively descend down to ColumnElement objects). Subject: sqlalchemy: this version has easy cases going well. hard cases not so much details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/e006adb7f893 changeset: 8202:e006adb7f893 user: Mike Bayer <mi...@zz...> date: Mon Feb 06 19:49:26 2012 -0500 description: this version has easy cases going well. hard cases not so much Subject: sqlalchemy: local_remote_pairs/remote_side are comparing against existing details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1808529e77e1 changeset: 8203:1808529e77e1 user: Mike Bayer <mi...@zz...> date: Mon Feb 06 20:47:18 2012 -0500 description: local_remote_pairs/remote_side are comparing against existing 100% Subject: sqlalchemy: simplify remote annotation significantly, and also details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/b08867c13893 changeset: 8204:b08867c13893 user: Mike Bayer <mi...@zz...> date: Wed Feb 08 10:14:36 2012 -0500 description: simplify remote annotation significantly, and also catch the actual remote columns more accurately. Subject: sqlalchemy: merge tip details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/83d6ce27410d changeset: 8205:83d6ce27410d user: Mike Bayer <mi...@zz...> date: Wed Feb 08 17:43:45 2012 -0500 description: merge tip Subject: sqlalchemy: new test that illustrates the breakage of partial remote side when FKs are assumed details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/cdb55a6228a6 changeset: 8206:cdb55a6228a6 user: Mike Bayer <mi...@zz...> date: Wed Feb 08 17:44:57 2012 -0500 description: new test that illustrates the breakage of partial remote side when FKs are assumed Subject: sqlalchemy: - hooks in the new object to RelationshipProperty, restores the "local" annotation. details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/704a1f2b91b6 changeset: 8207:704a1f2b91b6 user: Mike Bayer <mi...@zz...> date: Wed Feb 08 18:46:36 2012 -0500 description: - hooks in the new object to RelationshipProperty, restores the "local" annotation. also added in sync pairs, etc. many-to-many is currently broken. Subject: sqlalchemy: - got m2m, local_remote_pairs, etc. working details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a5974dba15ba changeset: 8208:a5974dba15ba user: Mike Bayer <mi...@zz...> date: Thu Feb 09 21:16:53 2012 -0500 description: - got m2m, local_remote_pairs, etc. working - using new traversal that returns the product of both sides of a binary, starting to work with (a+b) == (c+d) types of joins. primaryjoins on functions working - annotations working, including reversing local/remote when doing backref Subject: sqlalchemy: fix up this test details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a7e5fd5f368d changeset: 8209:a7e5fd5f368d user: Mike Bayer <mi...@zz...> date: Fri Feb 10 11:54:18 2012 -0500 description: fix up this test Subject: sqlalchemy: add a test for reverse remote details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/cd475a2a2384 changeset: 8210:cd475a2a2384 user: Mike Bayer <mi...@zz...> date: Fri Feb 10 11:58:13 2012 -0500 description: add a test for reverse remote Subject: sqlalchemy: - move properties to use the new create_joins details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/10edc4e788b7 changeset: 8211:10edc4e788b7 user: Mike Bayer <mi...@zz...> date: Fri Feb 10 17:50:15 2012 -0500 description: - move properties to use the new create_joins - fix up subquery eager loading Subject: sqlalchemy: tweak for correlated subqueries here, seems to work for test_eager_relations:CorrelatedSubqueryTest but need some more testing here details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/fcbb8f47c5aa changeset: 8212:fcbb8f47c5aa user: Mike Bayer <mi...@zz...> date: Fri Feb 10 17:59:06 2012 -0500 description: tweak for correlated subqueries here, seems to work for test_eager_relations:CorrelatedSubqueryTest but need some more testing here Subject: sqlalchemy: many fixes but still can't get heuristics to work as well as what's existing, details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/9e488f06c753 changeset: 8213:9e488f06c753 user: Mike Bayer <mi...@zz...> date: Sat Feb 11 15:43:05 2012 -0500 description: many fixes but still can't get heuristics to work as well as what's existing, tests still failing Subject: sqlalchemy: - figured out again why deannotate must clone() details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/0aa6db986dcb changeset: 8214:0aa6db986dcb user: Mike Bayer <mi...@zz...> date: Sat Feb 11 20:33:56 2012 -0500 description: - figured out again why deannotate must clone() - got everything working. just need to update error strings Subject: sqlalchemy: start to work on error messages, allow foreign_keys as only argument details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/06f9a5c7a007 changeset: 8215:06f9a5c7a007 user: Mike Bayer <mi...@zz...> date: Sat Feb 25 17:10:06 2012 -0500 description: start to work on error messages, allow foreign_keys as only argument if otherwise can't determine join condition due to no fks Subject: sqlalchemy: almost through all the fine tuning details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1cea58989cd3 changeset: 8216:1cea58989cd3 user: Mike Bayer <mi...@zz...> date: Sat Feb 25 18:04:40 2012 -0500 description: almost through all the fine tuning Subject: sqlalchemy: - move create_lazy_clause() to relationships details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/28b474fefdd6 changeset: 8217:28b474fefdd6 user: Mike Bayer <mi...@zz...> date: Sun Apr 01 18:18:12 2012 -0400 description: - move create_lazy_clause() to relationships - add foreign, remote annotations to declarative Subject: sqlalchemy: every test passing for test_relationships details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/677ca9ee79ef changeset: 8218:677ca9ee79ef user: Mike Bayer <mi...@zz...> date: Tue Apr 03 11:14:14 2012 -0400 description: every test passing for test_relationships Subject: sqlalchemy: then spiff up that error msg details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/ca981b43e78e changeset: 8219:ca981b43e78e user: Mike Bayer <mi...@zz...> date: Tue Apr 03 11:24:16 2012 -0400 description: then spiff up that error msg Subject: sqlalchemy: 0.8 initial prep details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/71a219c97596 changeset: 8220:71a219c97596 user: Mike Bayer <mi...@zz...> date: Sun Apr 22 18:10:47 2012 -0400 description: 0.8 initial prep Subject: sqlalchemy: - merged #1401 branch from bitbucket details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/e9ae279d3117 changeset: 8221:e9ae279d3117 user: Mike Bayer <mi...@zz...> date: Sun Apr 22 19:43:31 2012 -0400 description: - merged #1401 branch from bitbucket - resolved some serious speed hits I missed, we need to ensure only deannotated columns are used in the local/remote collections and soforth so that hash lookups against mapped columns don't dig into __eq__() - fix some other parity mismatches regarding stuff from [ticket:2453], including finding another case where _deep_annotate() was doing the wrong thing, new tests. - [feature] Major rewrite of relationship() internals now allow join conditions which include columns pointing to themselves within composite foreign keys. A new API for very specialized primaryjoin conditions is added, allowing conditions based on SQL functions, CAST, etc. to be handled by placing the annotation functions remote() and foreign() inline within the expression when necessary. Previous recipes using the semi-private _local_remote_pairs approach can be upgraded to this new approach. [ticket:1401] Subject: sqlalchemy: - merge attribute flag overhaul for [ticket:2358] details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1ecfbae8fe80 changeset: 8222:1ecfbae8fe80 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 11:45:06 2012 -0400 description: - merge attribute flag overhaul for [ticket:2358] Subject: sqlalchemy: make auto-correlation the same for Query & select() details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/90acd39639b6 changeset: 8223:90acd39639b6 user: _diana_ date: Mon Apr 02 21:42:17 2012 -0400 description: make auto-correlation the same for Query & select() Subject: sqlalchemy: - re-merge + CHANGES details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/0cf9ec2e2712 changeset: 8224:0cf9ec2e2712 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 11:50:47 2012 -0400 description: - re-merge + CHANGES Subject: sqlalchemy: begin implementing inspection system for #2208 details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/06eb1fca6f8b changeset: 8225:06eb1fca6f8b user: Mike Bayer <mi...@zz...> date: Tue Apr 03 18:53:39 2012 -0400 description: begin implementing inspection system for #2208 Subject: sqlalchemy: merge fix details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/ad70dd620b15 changeset: 8226:ad70dd620b15 user: Mike Bayer <mi...@zz...> date: Tue Apr 03 18:55:10 2012 -0400 description: merge fix Subject: sqlalchemy: - the inspect interface is done, needs docs. details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/e53c0b36c8e7 changeset: 8227:e53c0b36c8e7 user: Mike Bayer <mi...@zz...> date: Wed Apr 04 19:08:05 2012 -0400 description: - the inspect interface is done, needs docs. - start dressing up InstanceState for it's coming out, start moving internal things to be underscored within the lib Subject: sqlalchemy: merge patch for [ticket:2208]. This still needs documentation. details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1474ec97a187 changeset: 8228:1474ec97a187 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 12:03:54 2012 -0400 description: merge patch for [ticket:2208]. This still needs documentation. Subject: sqlalchemy: - some adjustments to keep hybrid properties working details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1ccebe5620d1 changeset: 8229:1ccebe5620d1 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 12:48:26 2012 -0400 description: - some adjustments to keep hybrid properties working - callcount here seems to have gone up by five, reason not certain Subject: sqlalchemy: the callcounts are greater here since object_mapper() has a little more overhead to it now details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/6daa37003c9b changeset: 8230:6daa37003c9b user: Mike Bayer <mi...@zz...> date: Mon Apr 23 18:53:58 2012 -0400 description: the callcounts are greater here since object_mapper() has a little more overhead to it now Subject: sqlalchemy: - [removed] The legacy "mutable" system of the details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/da980b168de1 changeset: 8231:da980b168de1 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 18:59:17 2012 -0400 description: - [removed] The legacy "mutable" system of the ORM, including the MutableType class as well as the mutable=True flag on PickleType and postgresql.ARRAY has been removed. In-place mutations are detected by the ORM using the sqlalchemy.ext.mutable extension, introduced in 0.7. The removal of MutableType and associated constructs removes a great deal of complexity from SQLAlchemy's internals. The approach performed poorly as it would incur a scan of the full contents of the Session when in use. [ticket:2442] Subject: sqlalchemy: - [feature] New standalone function with_polymorphic() details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/5b6237e3f068 changeset: 8232:5b6237e3f068 user: Mike Bayer <mi...@zz...> date: Mon Apr 23 22:17:25 2012 -0400 description: - [feature] New standalone function with_polymorphic() provides the functionality of query.with_polymorphic() in a standalone form. It can be applied to any entity within a query, including as the target of a join in place of the "of_type()" modifier. [ticket:2333] - redo a large portion of the inheritance docs in terms of declarative, new with_polymorphic() function - upgrade examples/inheritance/polymorph, rename to "joined" Subject: sqlalchemy: - [bug] removed legacy behavior whereby details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a225b298044b changeset: 8233:a225b298044b user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:16:03 2012 -0400 description: - [bug] removed legacy behavior whereby a column comparison to a scalar SELECT via == would coerce to an IN with the SQL server dialect. This is implicit behavior which fails in other scenarios so is removed. Code which relies on this needs to be modified to use column.in_(select) explicitly. [ticket:2277] Subject: sqlalchemy: changelog adjust details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a399bff9d183 changeset: 8234:a399bff9d183 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:16:24 2012 -0400 description: changelog adjust Subject: sqlalchemy: - [bug] The names of the columns on the details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/c3020d28c5a0 changeset: 8235:c3020d28c5a0 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:24:23 2012 -0400 description: - [bug] The names of the columns on the .c. attribute of a select().apply_labels() is now based on <tablename>_<colkey> instead of <tablename>_<colname>, for those columns that have a distinctly named .key. [ticket:2397] Subject: sqlalchemy: callcount tweak here, this moved up due to r5b6237e3f068 details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/4eb6bf89fa82 changeset: 8236:4eb6bf89fa82 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:34:56 2012 -0400 description: callcount tweak here, this moved up due to r5b6237e3f068 Subject: sqlalchemy: - [bug] The "passive" flag on Session.is_modified() details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/4a67888ee27f changeset: 8237:4a67888ee27f user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:55:04 2012 -0400 description: - [bug] The "passive" flag on Session.is_modified() no longer has any effect. is_modified() in all cases looks only at local in-memory modified flags and will not emit any SQL or invoke loader callables/initializers. [ticket:2320] Subject: sqlalchemy: - [bug] The warning emitted when using details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/f858317ca553 changeset: 8238:f858317ca553 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 11:58:14 2012 -0400 description: - [bug] The warning emitted when using delete-orphan cascade with one-to-many or many-to-many without single-parent=True is now an error. The ORM would fail to function subsequent to this warning in any case. [ticket:2405] Subject: sqlalchemy: - [feature] The column_reflect event now details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1a2a7eb1a822 changeset: 8239:1a2a7eb1a822 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 12:01:04 2012 -0400 description: - [feature] The column_reflect event now accepts the Inspector object as the first argument, preceding "table". Code which uses the 0.7 version of this very new event will need modification to add the "inspector" object as the first argument. [ticket:2418] Subject: sqlalchemy: - [feature] Added a new system details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/bbb29729e492 changeset: 8240:bbb29729e492 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 13:00:30 2012 -0400 description: - [feature] Added a new system for registration of new dialects in-process without using an entrypoint. See the docs for "Registering New Dialects". [ticket:2462] Subject: sqlalchemy: - [bug] column.label(None) now produces an details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/43fe92273d3b changeset: 8241:43fe92273d3b user: Mike Bayer <mi...@zz...> date: Tue Apr 24 13:04:38 2012 -0400 description: - [bug] column.label(None) now produces an anonymous label, instead of returning the column object itself, consistent with the behavior of label(column, None). [ticket:2168] Subject: sqlalchemy: update doc version details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/bec52db5e4d3 changeset: 8242:bec52db5e4d3 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 13:07:56 2012 -0400 description: update doc version Subject: sqlalchemy: - remove sqlsoup [ticket:2262] details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/328b4dbb7418 changeset: 8243:328b4dbb7418 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 13:14:08 2012 -0400 description: - remove sqlsoup [ticket:2262] - remove sqlalchemy.exceptions [ticket:2433] Subject: sqlalchemy: Move a SQLLite datetime test to a new DateTimeTest case details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/469db2dbdcf7 changeset: 8244:469db2dbdcf7 user: Nathan Wright <tha...@gm...> date: Mon Mar 12 15:48:29 2012 -0700 description: Move a SQLLite datetime test to a new DateTimeTest case Subject: sqlalchemy: Move a SQLLite datetime test to a new DateTimeTest case details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/7d32d771c04c changeset: 8245:7d32d771c04c user: Nathan Wright <tha...@gm...> date: Mon Mar 12 15:48:29 2012 -0700 description: Move a SQLLite datetime test to a new DateTimeTest case Subject: sqlalchemy: Improve SQLite DATETIME storage format handling [ticket:2363] details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/4ea04df11a1b changeset: 8246:4ea04df11a1b user: Nathan Wright <tha...@gm...> date: Mon Mar 12 21:31:12 2012 -0700 description: Improve SQLite DATETIME storage format handling [ticket:2363] This breaks backwards compatibility with old SQLite DATETIME, DATE, and TIME storage_format strings. Formatting now occurs with named instead of positional parameters. The regexp argument can still use positional arguments, but named groupings are also supported. This means that you can omit fields and change the order of date fields as desired. SQLite's DATETIME and TIME also gained a truncate_microseconds argument. This is shorthand for modifying the format string. Fortunately the str_to_datetime and str_to_time processors written in C already support omitting microseconds, so we don't have to resort to python processing for this case. Subject: sqlalchemy: - [feature] the SQLite date and time types details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/4087e6f0a6cd changeset: 8247:4087e6f0a6cd user: Mike Bayer <mi...@zz...> date: Tue Apr 24 15:49:52 2012 -0400 description: - [feature] the SQLite date and time types have been overhauled to support a more open ended format for input and output, using name based format strings and regexps. A new argument "microseconds" also provides the option to omit the "microseconds" portion of timestamps. Thanks to Nathan Wright for the work and tests on this. [ticket:2363] Subject: sqlalchemy: - [feature] The after_attach event is now details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a6b30bffacfa changeset: 8248:a6b30bffacfa user: Mike Bayer <mi...@zz...> date: Tue Apr 24 15:52:09 2012 -0400 description: - [feature] The after_attach event is now emitted after the object is established in Session.new or Session.identity_map upon Session.add(), Session.merge(), etc., so that the object is represented in these collections when the event is called. [ticket:2464] Subject: sqlalchemy: - [feature] The behavior of column targeting details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/5fd3d8e1dc45 changeset: 8249:5fd3d8e1dc45 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:03:00 2012 -0400 description: - [feature] The behavior of column targeting in result sets is now case sensitive by default. SQLAlchemy for many years would run a case-insensitive conversion on these values, probably to alleviate early case sensitivity issues with dialects like Oracle and Firebird. These issues have been more cleanly solved in more modern versions so the performance hit of calling lower() on identifiers is removed. The case insensitive comparisons can be re-enabled by setting "case_insensitive=False" on create_engine(). [ticket:2423] Subject: sqlalchemy: fix import here details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/9947f2221dbb changeset: 8250:9947f2221dbb user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:03:51 2012 -0400 description: fix import here Subject: sqlalchemy: - [bug] All of UniqueConstraint, ForeignKeyConstraint, details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/b4318632604d changeset: 8251:b4318632604d user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:08:35 2012 -0400 description: - [bug] All of UniqueConstraint, ForeignKeyConstraint, CheckConstraint, and PrimaryKeyConstraint will attach themselves to their parent table automatically when they refer to a Table-bound Column object directly (i.e. not just string column name), and refer to one and only one Table. Prior to 0.8 this behavior occurred for UniqueConstraint and PrimaryKeyConstraint, but not ForeignKeyConstraint or CheckConstraint. [ticket:2410] Subject: sqlalchemy: deprecate inspector.get_primary_keys() in favor of inspector.get_pk_constraint() details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/489dcf8d86b6 changeset: 8252:489dcf8d86b6 user: _diana_ date: Mon Apr 02 21:07:37 2012 -0400 description: deprecate inspector.get_primary_keys() in favor of inspector.get_pk_constraint() - see #2422 Subject: sqlalchemy: - [feature] Inspector.get_primary_keys() is details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/3aac7b46b415 changeset: 8253:3aac7b46b415 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:25:20 2012 -0400 description: - [feature] Inspector.get_primary_keys() is deprecated; use Inspector.get_pk_constraint(). Courtesy Diana Clarke. [ticket:2422] - restored default get_primary_keys()/get_pk_constraint() wrapper to help maintain compatibility with third party dialects created against 0.6 or 0.7 Subject: sqlalchemy: - [feature] The "unconsumed column names" warning emitted details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/369e2cd1ee4b changeset: 8254:369e2cd1ee4b user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:27:58 2012 -0400 description: - [feature] The "unconsumed column names" warning emitted when keys are present in insert.values() or update.values() that aren't in the target table is now an exception. [ticket:2415] Subject: sqlalchemy: - [feature] postgresql.ARRAY features an optional details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/0ba8b4fd402f changeset: 8255:0ba8b4fd402f user: Mike Bayer <mi...@zz...> date: Tue Apr 24 16:44:53 2012 -0400 description: - [feature] postgresql.ARRAY features an optional "dimension" argument, will assign a specific number of dimensions to the array which will render in DDL as ARRAY[][]..., also improves performance of bind/result processing. [ticket:2441] Subject: sqlalchemy: - [feature] Calling rollback() within a details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/b77bcd95d9ba changeset: 8256:b77bcd95d9ba user: Mike Bayer <mi...@zz...> date: Tue Apr 24 18:06:27 2012 -0400 description: - [feature] Calling rollback() within a session.begin_nested() will now only expire those objects that had net changes within the scope of that transaction, that is objects which were dirty or were modified on a flush. This allows the typical use case for begin_nested(), that of altering a small subset of objects, to leave in place the data from the larger enclosing set of objects that weren't modified in that sub-transaction. [ticket:2452] - inline the "register_newly_XYZ" functions to operate upon collections to reduce method calls Subject: sqlalchemy: - put the correct target here in the log message details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/482f00fad828 changeset: 8257:482f00fad828 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 18:16:52 2012 -0400 description: - put the correct target here in the log message Subject: sqlalchemy: py3k fixes details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/5977ecc49cb2 changeset: 8258:5977ecc49cb2 user: Mike Bayer <mi...@zz...> date: Tue Apr 24 19:15:00 2012 -0400 description: py3k fixes diffstat: .hgtags | 1 + AUTHORS | 1 + CHANGES | 510 +++ CHANGES_PRE_06 | 121 + doc/build/conf.py | 6 +- doc/build/core/connections.rst | 46 + doc/build/core/engines.rst | 105 +- doc/build/core/expression_api.rst | 8 +- doc/build/core/types.rst | 12 +- doc/build/dialects/mssql.rst | 2 + doc/build/dialects/mysql.rst | 2 + doc/build/dialects/oracle.rst | 2 + doc/build/index.rst | 1 - doc/build/orm/collections.rst | 18 +- doc/build/orm/extensions/index.rst | 1 - doc/build/orm/extensions/orderinglist.rst | 9 + doc/build/orm/extensions/sqlsoup.rst | 10 - doc/build/orm/inheritance.rst | 514 +- doc/build/orm/session.rst | 7 + doc/build/templates/search.mako | 8 +- examples/beaker_caching/caching_query.py | 12 +- examples/declarative_reflection/declarative_reflection.py | 11 + examples/inheritance/joined.py | 135 + examples/inheritance/polymorph.py | 125 - lib/sqlalchemy/__init__.py | 12 +- lib/sqlalchemy/cextension/processors.c | 25 +- lib/sqlalchemy/cextension/resultproxy.c | 17 +- lib/sqlalchemy/connectors/pyodbc.py | 12 +- lib/sqlalchemy/dialects/__init__.py | 28 + lib/sqlalchemy/dialects/drizzle/__init__.py | 26 +- lib/sqlalchemy/dialects/drizzle/base.py | 210 +- lib/sqlalchemy/dialects/drizzle/mysqldb.py | 50 +- lib/sqlalchemy/dialects/firebird/base.py | 11 +- lib/sqlalchemy/dialects/informix/base.py | 12 +- lib/sqlalchemy/dialects/mssql/base.py | 108 +- lib/sqlalchemy/dialects/mssql/mxodbc.py | 2 +- lib/sqlalchemy/dialects/mssql/pyodbc.py | 28 +- lib/sqlalchemy/dialects/mysql/base.py | 145 +- lib/sqlalchemy/dialects/oracle/base.py | 38 +- lib/sqlalchemy/dialects/oracle/cx_oracle.py | 32 +- lib/sqlalchemy/dialects/postgresql/base.py | 170 +- lib/sqlalchemy/dialects/postgresql/psycopg2.py | 22 + lib/sqlalchemy/dialects/postgresql/pypostgresql.py | 2 +- lib/sqlalchemy/dialects/sqlite/base.py | 136 +- lib/sqlalchemy/dialects/sybase/pysybase.py | 8 +- lib/sqlalchemy/engine/__init__.py | 6 + lib/sqlalchemy/engine/base.py | 418 +- lib/sqlalchemy/engine/default.py | 14 +- lib/sqlalchemy/engine/reflection.py | 43 +- lib/sqlalchemy/engine/strategies.py | 9 +- lib/sqlalchemy/engine/url.py | 57 +- lib/sqlalchemy/event.py | 35 +- lib/sqlalchemy/events.py | 36 +- lib/sqlalchemy/exc.py | 7 + lib/sqlalchemy/ext/associationproxy.py | 8 +- lib/sqlalchemy/ext/declarative.py | 14 +- lib/sqlalchemy/ext/horizontal_shard.py | 2 +- lib/sqlalchemy/ext/hybrid.py | 65 +- lib/sqlalchemy/ext/mutable.py | 2 +- lib/sqlalchemy/ext/orderinglist.py | 23 +- lib/sqlalchemy/ext/sqlsoup.py | 808 ---- lib/sqlalchemy/inspection.py | 44 + lib/sqlalchemy/orm/__init__.py | 19 +- lib/sqlalchemy/orm/attributes.py | 219 +- lib/sqlalchemy/orm/collections.py | 143 +- lib/sqlalchemy/orm/descriptor_props.py | 3 +- lib/sqlalchemy/orm/dynamic.py | 12 +- lib/sqlalchemy/orm/identity.py | 15 +- lib/sqlalchemy/orm/instrumentation.py | 10 +- lib/sqlalchemy/orm/mapper.py | 70 +- lib/sqlalchemy/orm/persistence.py | 20 +- lib/sqlalchemy/orm/properties.py | 752 +--- lib/sqlalchemy/orm/query.py | 462 +- lib/sqlalchemy/orm/relationships.py | 856 +++++ lib/sqlalchemy/orm/scoping.py | 12 +- lib/sqlalchemy/orm/session.py | 211 +- lib/sqlalchemy/orm/state.py | 260 +- lib/sqlalchemy/orm/strategies.py | 108 +- lib/sqlalchemy/orm/unitofwork.py | 20 +- lib/sqlalchemy/orm/util.py | 323 +- lib/sqlalchemy/pool.py | 2 +- lib/sqlalchemy/processors.py | 8 +- lib/sqlalchemy/schema.py | 65 +- lib/sqlalchemy/sql/compiler.py | 163 +- lib/sqlalchemy/sql/expression.py | 356 +- lib/sqlalchemy/sql/operators.py | 5 + lib/sqlalchemy/sql/util.py | 172 +- lib/sqlalchemy/sql/visitors.py | 42 +- lib/sqlalchemy/types.py | 250 +- lib/sqlalchemy/util/__init__.py | 4 +- lib/sqlalchemy/util/compat.py | 6 + lib/sqlalchemy/util/langhelpers.py | 59 +- setup.py | 28 +- test/aaa_profiling/test_compiler.py | 2 +- test/aaa_profiling/test_memusage.py | 64 +- test/aaa_profiling/test_orm.py | 6 +- test/aaa_profiling/test_resultset.py | 16 +- test/aaa_profiling/test_zoomark.py | 5 +- test/aaa_profiling/test_zoomark_orm.py | 6 +- test/base/test_events.py | 104 + test/base/test_inspect.py | 62 + test/base/test_utils.py | 21 + test/bootstrap/config.py | 1 + test/bootstrap/noseplugin.py | 2 + test/dialect/test_mssql.py | 125 +- test/dialect/test_mysql.py | 97 +- test/dialect/test_oracle.py | 152 +- test/dialect/test_postgresql.py | 99 +- test/dialect/test_sqlite.py | 103 +- test/engine/test_execute.py | 182 + test/engine/test_parseconnect.py | 39 + test/engine/test_processors.py | 97 +- test/engine/test_reflection.py | 95 +- test/engine/test_transaction.py | 92 +- test/ext/test_associationproxy.py | 10 +- test/ext/test_declarative.py | 22 + test/ext/test_orderinglist.py | 32 +- test/ext/test_serializer.py | 19 +- test/ext/test_sqlsoup.py | 447 -- test/lib/fixtures.py | 45 +- test/lib/requires.py | 6 +- test/lib/testing.py | 20 + test/orm/_fixtures.py | 45 +- test/orm/inheritance/_poly_fixtures.py | 299 + test/orm/inheritance/test_abc_inheritance.py | 6 +- test/orm/inheritance/test_assorted_poly.py | 1523 +++++++++ test/orm/inheritance/test_basic.py | 46 +- test/orm/inheritance/test_poly_persistence.py | 347 ++ test/orm/inheritance/test_polymorph.py | 291 - test/orm/inheritance/test_polymorph2.py | 1266 ------- test/orm/inheritance/test_polymorphic_rel.py | 1369 ++++++++ test/orm/inheritance/test_query.py | 2136 ------------- test/orm/inheritance/test_relationship.py | 877 +++++ test/orm/inheritance/test_with_poly.py | 113 + test/orm/test_attributes.py | 149 +- test/orm/test_backref_mutations.py | 4 +- test/orm/test_cascade.py | 36 +- test/orm/test_collection.py | 88 +- test/orm/test_events.py | 37 +- test/orm/test_froms.py | 82 +- test/orm/test_inspect.py | 290 + test/orm/test_joins.py | 12 +- test/orm/test_legacy_mutable.py | 375 -- test/orm/test_lockmode.py | 114 + test/orm/test_mapper.py | 82 +- test/orm/test_merge.py | 63 +- test/orm/test_pickled.py | 68 + test/orm/test_query.py | 120 +- test/orm/test_rel_fn.py | 927 +++++ test/orm/test_relationships.py | 890 +++-- test/orm/test_session.py | 24 +- test/orm/test_transaction.py | 51 +- test/orm/test_unitofwork.py | 25 + test/sql/test_compiler.py | 261 +- test/sql/test_constraints.py | 72 +- test/sql/test_defaults.py | 2 +- test/sql/test_generative.py | 180 +- test/sql/test_labels.py | 7 +- test/sql/test_metadata.py | 2 +- test/sql/test_query.py | 84 +- test/sql/test_selectable.py | 174 +- test/sql/test_types.py | 24 +- test/sql/test_update.py | 25 + 163 files changed, 14344 insertions(+), 9240 deletions(-) diffs (truncated from 30928 to 300 lines): diff -r 913e3f48c05a -r 5977ecc49cb2 .hgtags --- a/.hgtags Sun Feb 05 16:58:32 2012 -0500 +++ b/.hgtags Tue Apr 24 19:15:00 2012 -0400 @@ -86,3 +86,4 @@ 74c4ef8e0d240bc441cf81d6f44957c263ec4a9e rel_0_7_3 19a7e3a6058878ecc07a40ea563e9cf92110be3a rel_0_7_4 ebe9514a69a4b4ec6209f0e9aa43053ba28d080b rel_0_7_5 +d557287431986274a796348750f1c6ce885b196c rel_0_7_6 diff -r 913e3f48c05a -r 5977ecc49cb2 AUTHORS --- a/AUTHORS Sun Feb 05 16:58:32 2012 -0500 +++ b/AUTHORS Tue Apr 24 19:15:00 2012 -0400 @@ -5,6 +5,7 @@ - Michael Bayer <mi...@zz...> - Jason Kirtland <je...@di...> - Gaetan de Menten <gde...@gm...> +- Diana Clarke <dia...@gm...> - Michael Trier <mt...@gm...> - Philip Jenvey <pj...@un...> - Ants Aasma <ant...@gm...> diff -r 913e3f48c05a -r 5977ecc49cb2 CHANGES --- a/CHANGES Sun Feb 05 16:58:32 2012 -0500 +++ b/CHANGES Tue Apr 24 19:15:00 2012 -0400 @@ -3,9 +3,397 @@ ======= CHANGES ======= + +0.8.0b1 +======= +- general + - SQLAlchemy 0.8 now targets Python 2.5 and + above. Python 2.4 is no longer supported. + + - [removed] The "sqlalchemy.exceptions" + synonym for "sqlalchemy.exc" is removed + fully. [ticket:2433] + +- orm + - [removed] The legacy "mutable" system of the + ORM, including the MutableType class as well + as the mutable=True flag on PickleType + and postgresql.ARRAY has been removed. + In-place mutations are detected by the ORM + using the sqlalchemy.ext.mutable extension, + introduced in 0.7. The removal of MutableType + and associated constructs removes a great + deal of complexity from SQLAlchemy's internals. + The approach performed poorly as it would incur + a scan of the full contents of the Session + when in use. [ticket:2442] + + - [feature] Major rewrite of relationship() + internals now allow join conditions which + include columns pointing to themselves + within composite foreign keys. A new + API for very specialized primaryjoin conditions + is added, allowing conditions based on + SQL functions, CAST, etc. to be handled + by placing the annotation functions + remote() and foreign() inline within the + expression when necessary. Previous recipes + using the semi-private _local_remote_pairs + approach can be upgraded to this new + approach. [ticket:1401] + + - [feature] New standalone function with_polymorphic() + provides the functionality of query.with_polymorphic() + in a standalone form. It can be applied to any + entity within a query, including as the target + of a join in place of the "of_type()" modifier. + [ticket:2333] + + - [feature] Added new core function "inspect()", + which serves as a generic gateway to + introspection into mappers, objects, + others. The Mapper and InstanceState + objects have been enhanced with a public + API that allows inspection of mapped + attributes, including filters for column-bound + or relationship-bound properties, inspection + of current object state, history of + attributes, etc. [ticket:2208] + + - [feature] Calling rollback() within a + session.begin_nested() will now only expire + those objects that had net changes within the + scope of that transaction, that is objects which + were dirty or were modified on a flush. This + allows the typical use case for begin_nested(), + that of altering a small subset of objects, to + leave in place the data from the larger enclosing + set of objects that weren't modified in + that sub-transaction. [ticket:2452] + + - [bug] The "passive" flag on Session.is_modified() + no longer has any effect. is_modified() in + all cases looks only at local in-memory + modified flags and will not emit any + SQL or invoke loader callables/initializers. + [ticket:2320] + + - [bug] The warning emitted when using + delete-orphan cascade with one-to-many + or many-to-many without single-parent=True + is now an error. The ORM + would fail to function subsequent to this + warning in any case. [ticket:2405] + + - [feature] Query now "auto correlates" by + default in the same way as select() does. + Previously, a Query used as a subquery + in another would require the correlate() + method be called explicitly in order to + correlate a table on the inside to the + outside. As always, correlate(None) + disables correlation. [ticket:2179] + + - [feature] Added prefix_with() method + to Query, calls upon select().prefix_with() + to allow placement of MySQL SELECT + directives in statements. Courtesy + Diana Clarke [ticket:2443] + also in 0.7.7. + + - [bug] Fixed bug in 0.7.6 introduced by + [ticket:2409] whereby column_mapped_collection + used against columns that were mapped as + joins or other indirect selectables + would fail to function. + also in 0.7.7. + + - [feature] Added new flag to @validates + include_removes. When True, collection + remove and attribute del events + will also be sent to the validation function, + which accepts an additional argument + "is_remove" when this flag is used. + also in 0.7.7. + + - [feature] The after_attach event is now + emitted after the object is established + in Session.new or Session.identity_map + upon Session.add(), Session.merge(), + etc., so that the object is represented + in these collections when the event + is called. [ticket:2464] + + - [bug] Fixed bug whereby polymorphic_on + column that's not otherwise mapped on the + class would be incorrectly included + in a merge() operation, raising an error. + [ticket:2449] + also in 0.7.7. + + - [bug] Fixed bug in expression annotation + mechanics which could lead to incorrect + rendering of SELECT statements with aliases + and joins, particularly when using + column_property(). [ticket:2453] + also in 0.7.7. + + - [bug] Fixed bug which would prevent + OrderingList from being pickleable + [ticket:2454]. Courtesy Jeff Dairiki + also in 0.7.7. + +- engine + - [feature] Added a new system + for registration of new dialects in-process + without using an entrypoint. See the + docs for "Registering New Dialects". + [ticket:2462] + + - [bug] The names of the columns on the + .c. attribute of a select().apply_labels() + is now based on <tablename>_<colkey> instead + of <tablename>_<colname>, for those columns + that have a distinctly named .key. + [ticket:2397] + + - [feature] Inspector.get_primary_keys() is + deprecated; use Inspector.get_pk_constraint(). + Courtesy Diana Clarke. [ticket:2422] + +- sql + - [feature] The Inspector object can now be + acquired using the new inspect() service, + part of [ticket:2208] + + - [feature] The column_reflect event now + accepts the Inspector object as the first + argument, preceding "table". Code which + uses the 0.7 version of this very new + event will need modification to add the + "inspector" object as the first argument. + [ticket:2418] + + - [feature] The behavior of column targeting + in result sets is now case sensitive by + default. SQLAlchemy for many years would + run a case-insensitive conversion on these values, + probably to alleviate early case sensitivity + issues with dialects like Oracle and + Firebird. These issues have been more cleanly + solved in more modern versions so the performance + hit of calling lower() on identifiers is removed. + The case insensitive comparisons can be re-enabled + by setting "case_insensitive=False" on + create_engine(). [ticket:2423] + + - [feature] The "unconsumed column names" warning emitted + when keys are present in insert.values() or update.values() + that aren't in the target table is now an exception. + [ticket:2415] + + - [bug] All of UniqueConstraint, ForeignKeyConstraint, + CheckConstraint, and PrimaryKeyConstraint will + attach themselves to their parent table automatically + when they refer to a Table-bound Column object directly + (i.e. not just string column name), and refer to + one and only one Table. Prior to 0.8 this behavior + occurred for UniqueConstraint and PrimaryKeyConstraint, + but not ForeignKeyConstraint or CheckConstraint. + [ticket:2410] + + - [bug] column.label(None) now produces an + anonymous label, instead of returning the + column object itself, consistent with the behavior + of label(column, None). [ticket:2168] + + - [bug] Removed warning when Index is created + with no columns; while this might not be what + the user intended, it is a valid use case + as an Index could be a placeholder for just an + index of a certain name. + also in 0.7.7. + + - [feature] Added new connection event + dbapi_error(). Is called for all DBAPI-level + errors passing the original DBAPI exception + before SQLAlchemy modifies the state + of the cursor. + also in 0.7.7. + + - [bug] If conn.begin() fails when calling + "with engine.begin()", the newly acquired + Connection is closed explicitly before + propagating the exception onward normally. + also in 0.7.7. + +- sqlite + - [feature] the SQLite date and time types + have been overhauled to support a more open + ended format for input and output, using + name based format strings and regexps. A + new argument "microseconds" also provides + the option to omit the "microseconds" + portion of timestamps. Thanks to + Nathan Wright for the work and tests on + this. [ticket:2363] + +- mssql + - [bug] removed legacy behavior whereby + a column comparison to a scalar SELECT via + == would coerce to an IN with the SQL server + dialect. This is implicit + behavior which fails in other scenarios + so is removed. Code which relies on this + needs to be modified to use column.in_(select) + explicitly. [ticket:2277] + + - [feature] Added interim create_engine flag + supports_unicode_binds to PyODBC dialect, + to force whether or not the dialect + passes Python unicode literals to PyODBC + or not. + also in 0.7.7. + + - [bug] Repaired the use_scope_identity + create_engine() flag when using the pyodbc + dialect. Previously this flag would be + ignored if set to False. When set to False, + you'll get "SELECT @@identity" after each + INSERT to get at the last inserted ID, + for those tables which have "implicit_returning" + set to False. + also in 0.7.7. + + - [bug] UPDATE..FROM syntax with SQL Server + requires that the updated table be present + in the FROM clause when an alias of that + table is also present in the FROM clause. + The updated table is now always present + in the FROM, when FROM is present + in the first place. Courtesy sayap. + [ticket:2468] + also in 0.7.7. + +- postgresql + - [feature] Added new for_update/with_lockmode() |