Thread: [Sqlalchemy-commits] sqlalchemy: updatebase: add support for multi parameters
Brought to you by:
zzzeek
From: <co...@sq...> - 2012-12-08 19:35:58
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/71c5648ec003 changeset: 8991:71c5648ec003 user: Idan Kamara <ida...@gm...> date: Thu Dec 06 00:12:16 2012 +0200 description: updatebase: add support for multi parameters Subject: sqlalchemy: compiler: adjust _get_colparams to return the columns and parameters in separate lists details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/c3efee672e15 changeset: 8992:c3efee672e15 user: Idan Kamara <ida...@gm...> date: Wed Dec 05 23:45:49 2012 +0200 description: compiler: adjust _get_colparams to return the columns and parameters in separate lists Subject: sqlalchemy: compiler: add support for multirow inserts details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/ac0404d7d3a7 changeset: 8993:ac0404d7d3a7 user: Idan Kamara <ida...@gm...> date: Thu Dec 06 00:11:52 2012 +0200 description: compiler: add support for multirow inserts Some databases support this syntax for inserts: INSERT INTO table (id, name) VALUES ('v1', 'v2'), ('v3', 'v4'); which greatly increases INSERT speed. It is now possible to pass a list of lists/tuples/dictionaries as the values param to the Insert construct. We convert it to a flat dictionary so we can continue using bind params. The above query will be converted to: INSERT INTO table (id, name) VALUES (:id, :name), (:id0, :name0); Currently only supported on postgresql, mysql and sqlite. Subject: sqlalchemy: merge latest default details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/00f151de1ed7 changeset: 8994:00f151de1ed7 user: Mike Bayer <mi...@zz...> date: Sat Dec 08 11:23:21 2012 -0500 description: merge latest default Subject: sqlalchemy: - multivalued inserts, [ticket:2623] details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/9c6b8e1498c4 changeset: 8995:9c6b8e1498c4 user: Mike Bayer <mi...@zz...> date: Sat Dec 08 14:25:42 2012 -0500 description: - multivalued inserts, [ticket:2623] - update "not supported" messages for empty inserts, mutlivalue inserts - rework the ValuesBase approach for multiple value sets so that stmt.parameters does store a list for multiple values; the _has_multiple_parameters flag now indicates which of the two modes the statement is within. it now raises exceptions if a subsequent call to values() attempts to call a ValuesBase with one mode in the style of the other mode; that is, you can't switch a single- or multi- valued ValuesBase to the other mode, and also if a multiple value is passed simultaneously with a kwargs set. Added tests for these error conditions - Calling values() multiple times in multivalue mode now extends the parameter list to include the new parameter sets. - add error/test if multiple *args were passed to ValuesBase.values() - rework the compiler approach for multivalue inserts, back to where _get_colparams() returns the same list of (column, value) as before, thereby maintaining the identical number of append() and other calls when multivalue is not enabled. In the case of multivalue, it makes a last-minute switch to return a list of lists instead of the single list. As it constructs the additional lists, the inline defaults and other calculated default parameters of the first parameter set are copied into the newly generated lists so that these features continue to function for a multivalue insert. Multivalue inserts now add no additional function calls to the compilation for regular insert constructs. - parameter lists for multivalue inserts now includes an integer index for all parameter sets. - add detailed documentation for ValuesBase.values(), including careful wording to describe the difference between multiple values and an executemany() call. - add a test for multivalue insert + returning - it works ! - remove the very old/never used "postgresql_returning"/"firebird_returning" flags. diffstat: doc/build/changelog/changelog_07.rst | 302 +++++++++++++++----------- doc/build/changelog/changelog_08.rst | 99 +++++++- doc/build/core/connections.rst | 7 +- doc/build/core/schema.rst | 16 +- doc/build/orm/examples.rst | 9 +- doc/build/orm/extensions/mutable.rst | 2 +- examples/custom_attributes/__init__.py | 17 +- lib/sqlalchemy/dialects/mysql/base.py | 1 + lib/sqlalchemy/dialects/oracle/cx_oracle.py | 70 +++++- lib/sqlalchemy/dialects/postgresql/base.py | 1 + lib/sqlalchemy/dialects/sqlite/base.py | 1 + lib/sqlalchemy/engine/base.py | 14 +- lib/sqlalchemy/engine/default.py | 1 + lib/sqlalchemy/engine/reflection.py | 16 +- lib/sqlalchemy/engine/result.py | 10 +- lib/sqlalchemy/event.py | 3 + lib/sqlalchemy/ext/compiler.py | 11 +- lib/sqlalchemy/ext/mutable.py | 91 +++++--- lib/sqlalchemy/ext/serializer.py | 8 + lib/sqlalchemy/orm/deprecated_interfaces.py | 2 +- lib/sqlalchemy/orm/interfaces.py | 33 +- lib/sqlalchemy/orm/loading.py | 15 +- lib/sqlalchemy/orm/mapper.py | 6 +- lib/sqlalchemy/orm/query.py | 37 ++- lib/sqlalchemy/orm/strategies.py | 83 +++--- lib/sqlalchemy/orm/util.py | 189 +++++++++++----- lib/sqlalchemy/schema.py | 23 +- lib/sqlalchemy/sql/compiler.py | 89 ++++++- lib/sqlalchemy/sql/expression.py | 210 +++++++++++++----- lib/sqlalchemy/testing/requirements.py | 11 + test/aaa_profiling/test_memusage.py | 6 +- test/dialect/test_oracle.py | 85 +++++++ test/dialect/test_postgresql.py | 25 -- test/ext/test_mutable.py | 119 ++++++++-- test/orm/inheritance/test_polymorphic_rel.py | 38 +-- test/orm/inheritance/test_relationship.py | 243 +++++++++++++++++++++- test/orm/inheritance/test_single.py | 3 +- test/orm/test_eager_relations.py | 127 +----------- test/orm/test_inspect.py | 6 +- test/orm/test_joins.py | 30 ++- test/orm/test_mapper.py | 1 - test/orm/test_query.py | 45 ++- test/orm/test_subquery_relations.py | 55 +++- test/orm/test_utils.py | 254 +++++++++++++++++----- test/sql/test_compiler.py | 148 +++++++++++++- test/sql/test_generative.py | 130 +++++++++++- test/sql/test_operators.py | 52 ++++ test/sql/test_query.py | 12 + test/sql/test_returning.py | 49 ++- test/sql/test_selectable.py | 4 +- test/sql/test_types.py | 17 + 51 files changed, 2036 insertions(+), 790 deletions(-) diffs (truncated from 5587 to 300 lines): diff -r 2f2c99874ce4 -r 9c6b8e1498c4 doc/build/changelog/changelog_07.rst --- a/doc/build/changelog/changelog_07.rst Thu Nov 29 17:28:56 2012 -0500 +++ b/doc/build/changelog/changelog_07.rst Sat Dec 08 14:25:42 2012 -0500 @@ -3,10 +3,44 @@ 0.7 Changelog ============== - + .. changelog:: :version: 0.7.10 - :released: + :released: + + .. change:: + :tags: oracle, bug + :tickets: 2620 + + The Oracle LONG type, while an unbounded text type, does not appear + to use the cx_Oracle.LOB type when result rows are returned, + so the dialect has been repaired to exclude LONG from + having cx_Oracle.LOB filtering applied. + + .. change:: + :tags: oracle, bug + :tickets: 2611 + + Repaired the usage of ``.prepare()`` in conjunction with + cx_Oracle so that a return value of ``False`` will result + in no call to ``connection.commit()``, hence avoiding + "no transaction" errors. Two-phase transactions have + now been shown to work in a rudimental fashion with + SQLAlchemy and cx_oracle, however are subject to caveats + observed with the driver; check the documentation + for details. + + .. change:: + :tags: orm, bug + :tickets: 2624 + + The :class:`.MutableComposite` type did not allow for the + :meth:`.MutableBase.coerce` method to be used, even though + the code seemed to indicate this intent, so this now works + and a brief example is added. As a side-effect, + the mechanics of this event handler have been changed so that + new :class:`.MutableComposite` types no longer add per-type + global event handlers. Also in 0.8.0b2. .. change:: :tags: orm, bug @@ -52,7 +86,7 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: Fixed bug mostly local to new AbstractConcreteBase helper where the "type" @@ -68,7 +102,7 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: A warning is emitted when lazy='dynamic' is combined with uselist=False. This is an @@ -76,7 +110,7 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: Fixed bug whereby user error in related-object assignment could cause recursion overflow if the @@ -140,7 +174,7 @@ .. change:: :tags: bug, sql - :tickets: + :tickets: Fixed more un-intuitivenesses in CTEs which prevented referring to a CTE in a union @@ -261,7 +295,7 @@ .. change:: :tags: engine, bug - :tickets: + :tickets: Fixed the repr() of Enum to include the "name" and "native_enum" flags. Helps @@ -294,7 +328,7 @@ .. change:: :tags: sqlite, feature - :tickets: + :tickets: Added support for the localtimestamp() SQL function implemented in SQLite, courtesy @@ -320,7 +354,7 @@ .. change:: :tags: bug, mysql - :tickets: + :tickets: Updated mysqlconnector interface to use updated "client flag" and "charset" APIs, @@ -347,7 +381,7 @@ .. change:: :tags: mssql, bug - :tickets: + :tickets: Fixed bug where reflection of primary key constraint would double up columns if the same constraint/table @@ -385,7 +419,7 @@ .. change:: :tags: orm, feature - :tickets: + :tickets: The 'objects' argument to flush() is no longer deprecated, as some @@ -511,7 +545,7 @@ .. change:: :tags: orm, feature - :tickets: + :tickets: Added new flag to @validates include_removes. When True, collection @@ -548,7 +582,7 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: Fixed bug in relationship comparisons whereby calling unimplemented methods like @@ -558,7 +592,7 @@ .. change:: :tags: bug, sql - :tickets: + :tickets: Removed warning when Index is created with no columns; while this might not be what @@ -568,7 +602,7 @@ .. change:: :tags: feature, sql - :tickets: + :tickets: Added new connection event dbapi_error(). Is called for all DBAPI-level @@ -578,7 +612,7 @@ .. change:: :tags: bug, sql - :tickets: + :tickets: If conn.begin() fails when calling "with engine.begin()", the newly acquired @@ -593,7 +627,7 @@ .. change:: :tags: mssql, feature - :tickets: + :tickets: Added interim create_engine flag supports_unicode_binds to PyODBC dialect, @@ -603,7 +637,7 @@ .. change:: :tags: mssql, bug - :tickets: + :tickets: Repaired the use_scope_identity create_engine() flag when using the pyodbc @@ -657,7 +691,7 @@ .. change:: :tags: bug, mysql - :tickets: + :tickets: Fixed bug whereby get_view_names() for "information_schema" schema would fail @@ -724,7 +758,7 @@ .. change:: :tags: orm, feature - :tickets: + :tickets: Added "no_autoflush" context manager to Session, used with with: @@ -797,7 +831,7 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: Improved the "declarative reflection" example to support single-table inheritance, @@ -932,7 +966,7 @@ .. change:: :tags: engine, bug - :tickets: + :tickets: Added execution_options() call to MockConnection (i.e., that used with @@ -952,19 +986,19 @@ .. change:: :tags: engine, feature - :tickets: + :tickets: Added some decent context managers to Engine, Connection: - + with engine.begin() as conn: <work with conn in a transaction> - + and: - + with engine.connect() as conn: <work with conn> - + Both close out the connection when done, commit or rollback transaction with errors on engine.begin(). @@ -1031,7 +1065,7 @@ .. change:: :tags: examples, bug - :tickets: + :tickets: Altered _params_from_query() function in Beaker example to pull bindparams from the @@ -1076,7 +1110,7 @@ .. change:: :tags: orm, feature - :tickets: + :tickets: Added "class_registry" argument to declarative_base(). Allows two or more declarative @@ -1084,7 +1118,7 @@ .. change:: :tags: orm, feature - :tickets: + :tickets: query.filter() accepts multiple criteria which will join via AND, i.e. @@ -1115,14 +1149,14 @@ .. change:: :tags: orm, bug - :tickets: + :tickets: Fixed bug whereby hybrid_property didn't work as a kw arg in any(), has(). .. change:: :tags: orm - :tickets: + :tickets: Fixed regression from 0.6 whereby if "load_on_pending" relationship() flag were used @@ -1200,7 +1234,7 @@ |