:released: December 27, 2017
:released: October 13, 2017
.. change::
:tags: feature, postgresql
:tickets: 4109
Added a new flag ``use_batch_mode`` to the psycopg2 dialect. This flag
enables the use of psycopg2's ``psycopg2.extras.execute_batch``
extension when the :class:`_engine.Engine` calls upon
``cursor.executemany()``. This extension provides a critical
performance increase by over an order of magnitude when running INSERT
statements in batch. The flag is False by default as it is considered
to be experimental for now.
.. seealso::
:ref:`change_4109`
.. change::
:tags: bug, mssql
:tickets: 4061
SQL Server supports what SQLAlchemy calls "native boolean"
with its BIT type, as this type only accepts 0 or 1 and the
DBAPIs return its value as True/False. So the SQL Server
dialects now enable "native boolean" support, in that a
CHECK constraint is not generated for a :class:`.Boolean`
datatype. The only difference vs. other native boolean
is that there are no "true" / "false" constants so "1" and
"0" are still rendered here.
.. change::
:tags: bug, oracle
:tickets: 4064
Partial support for persisting and retrieving the Oracle value
"infinity" is implemented with cx_Oracle, using Python float values
only, e.g. ``float("inf")``. Decimal support is not yet fulfilled by
the cx_Oracle DBAPI driver.
.. change::
:tags: bug, oracle
The cx_Oracle dialect has been reworked and modernized to take advantage of
new patterns that weren't present in the old 4.x series of cx_Oracle. This
includes that the minimum cx_Oracle version is the 5.x series and that
cx_Oracle 6.x is now fully tested. The most significant change involves
type conversions, primarily regarding the numeric / floating point and LOB
datatypes, making more effective use of cx_Oracle type handling hooks to
simplify how bind parameter and result data is processed.
.. seealso::
:ref:`change_cxoracle_12`
.. change::
:tags: bug, oracle
:tickets: 3997
two phase support for cx_Oracle has been completely removed for all
versions of cx_Oracle, whereas in 1.2.0b1 this change only took effect for
the 6.x series of cx_Oracle. This feature never worked correctly
in any version of cx_Oracle and in cx_Oracle 6.x, the API which SQLAlchemy
relied upon was removed.
.. seealso::
:ref:`change_cxoracle_12`
.. change::
:tags: bug, oracle
The column keys present in a result set when using :meth:`_expression.Insert.returning`
with the cx_Oracle backend now use the correct column / label names
like that of all other dialects. Previously, these came out as
``ret_nnn``.
.. seealso::
:ref:`change_cxoracle_12`
.. change::
:tags: bug, oracle
Several parameters to the cx_Oracle dialect are now deprecated and will
have no effect: ``auto_setinputsizes``, ``exclude_setinputsizes``,
``allow_twophase``.
.. seealso::
:ref:`change_cxoracle_12`
.. change::
:tags: bug, sql
:tickets: 4075
Added a new method :meth:`.DefaultExecutionContext.get_current_parameters`
which is used within a function-based default value generator in
order to retrieve the current parameters being passed to the statement.
The new function differs from the
:attr:`.DefaultExecutionContext.current_parameters` attribute in
that it also provides for optional grouping of parameters that
correspond to a multi-valued "insert" construct. Previously it was not
possible to identify the subset of parameters that were relevant to
the function call.
.. seealso::
:ref:`change_4075`
:ref:`context_default_functions`
.. change::
:tags: bug, orm
:tickets: 4050
Fixed regression introduced in 1.2.0b1 due to :ticket:`3934` where the
:class:`.Session` would fail to "deactivate" the transaction, if a
rollback failed (the target issue is when MySQL loses track of a SAVEPOINT).
This would cause a subsequent call to :meth:`.Session.rollback` to raise
an error a second time, rather than completing and bringing the
:class:`.Session` back to ACTIVE.
.. change::
:tags: bug, postgresql
:tickets: 4041
Fixed bug where the pg8000 driver would fail if using
:meth:`_schema.MetaData.reflect` with a schema name, since the schema name would
be sent as a "quoted_name" object that's a string subclass, which pg8000
doesn't recognize. The quoted_name type is added to pg8000's
py_types collection on connect.
.. change::
:tags: bug, postgresql
:tickets: 4016
Enabled UUID support for the pg8000 driver, which supports native Python
uuid round trips for this datatype. Arrays of UUID are still not supported,
however.
.. change::
:tags: mssql, bug
:tickets: 4057
Fixed the pymssql dialect so that percent signs in SQL text, such
as used in modulus expressions or literal textual values, are
**not** doubled up, as seems to be what pymssql expects. This is
despite the fact that the pymssql DBAPI uses the "pyformat" parameter
style which itself considers the percent sign to be significant.
.. change::
:tags: bug, orm, declarative
:tickets: 4091
A warning is emitted if a subclass attempts to override an attribute
that was declared on a superclass using ``declared_attr.cascading``
that the overridden attribute will be ignored. This use
case cannot be fully supported down to further subclasses without more
complex development efforts, so for consistency the "cascading" is
honored all the way down regardless of overriding attributes.
.. change::
:tags: bug, orm, declarative
:tickets: 4092
A warning is emitted if the ``declared_attr.cascading`` attribute is
used with a special declarative name such as ``__tablename__``, as this
has no effect.
.. change::
:tags: feature, engine
:tickets: 4077
Added ``__next__()`` and ``next()`` methods to :class:`_engine.ResultProxy`,
so that the ``next()`` builtin function works on the object directly.
:class:`_engine.ResultProxy` has long had an ``__iter__()`` method which already
allows it to respond to the ``iter()`` builtin. The implementation
for ``__iter__()`` is unchanged, as performance testing has indicated
that iteration using a ``__next__()`` method with ``StopIteration``
is about 20% slower in both Python 2.7 and 3.6.
.. change::
:tags: feature, mssql
:tickets: 4086
Added a new :class:`_mssql.TIMESTAMP` datatype, that
correctly acts like a binary datatype for SQL Server
rather than a datetime type, as SQL Server breaks the
SQL standard here. Also added :class:`_mssql.ROWVERSION`,
as the "TIMESTAMP" type in SQL Server is deprecated in
favor of ROWVERSION.
.. change::
:tags: bug, orm
:tickets: 4084
Fixed issue where the :func:`.make_transient_to_detached` function
would expire all attributes on the target object, including "deferred"
attributes, which has the effect of the attribute being undeferred
for the next refresh, causing an unexpected load of the attribute.
.. change::
:tags: bug, orm
:tickets: 4040
Fixed bug involving delete-orphan cascade where a related item
that becomes an orphan before the parent object is part of a
session is still tracked as moving into orphan status, which results
in it being expunged from the session rather than being flushed.
.. note:: This fix was inadvertently merged during the 1.2.0b3
release and was **not added to the changelog** at that time.
This changelog note was added to the release retroactively as of
version 1.2.13.
.. change::
:tags: bug, orm
:tickets: 4026
Fixed bug in :ref:`change_3948` which prevented "selectin" and
"inline" settings in a multi-level class hierarchy from interacting
together as expected.
.. change::
:tags: bug, oracle
:tickets: 4042
Fixed bug where an index reflected under Oracle with an expression like
"column DESC" would not be returned, if the table also had no primary
key, as a result of logic that attempts to filter out the
index implicitly added by Oracle onto the primary key columns.
.. change::
:tags: bug, orm
:tickets: 4071
Removed the warnings that are emitted when the LRU caches employed
by the mapper as well as loader strategies reach their threshold; the
purpose of this warning was at first a guard against excess cache keys
being generated but became basically a check on the "creating many
engines" antipattern. While this is still an antipattern, the presence
of test suites which both create an engine per test as well as raise
on all warnings will be an inconvenience; it should not be critical
that such test suites change their architecture just for this warning
(though engine-per-test suite is always better).
.. change::
:tags: bug, orm
:tickets: 4049
Fixed regression where the use of a :func:`.undefer_group` option
in conjunction with a lazy loaded relationship option would cause
an attribute error, due to a bug in the SQL cache key generation
added in 1.2 as part of :ticket:`3954`.
.. change::
:tags: bug, oracle
:tickets: 4045
Fixed more regressions caused by cx_Oracle 6.0; at the moment, the only
behavioral change for users is disconnect detection now detects for
cx_Oracle.DatabaseError in addition to cx_Oracle.InterfaceError, as
this behavior seems to have changed. Other issues regarding numeric
precision and uncloseable connections are pending with the upstream
cx_Oracle issue tracker.
.. change::
:tags: bug, mssql
:tickets: 4060
Fixed bug where the SQL Server dialect could pull columns from multiple
schemas when reflecting a self-referential foreign key constraint, if
multiple schemas contained a constraint of the same name against a
table of the same name.
.. change::
:tags: feature, mssql
:tickets: 4058
Added support for "AUTOCOMMIT" isolation level, as established
via :meth:`_engine.Connection.execution_options`, to the
PyODBC and pymssql dialects. This isolation level sets the
appropriate DBAPI-specific flags on the underlying
connection object.
.. change::
:tags: bug, orm
:tickets: 4073
Modified the change made to the ORM update/delete evaluator in
:ticket:`3366` such that if an unmapped column expression is present
in the update or delete, if the evaluator can match its name to the
mapped columns of the target class, a warning is emitted, rather than
raising UnevaluatableError. This is essentially the pre-1.2 behavior,
and is to allow migration for applications that are currently relying
upon this pattern. However, if the given attribute name cannot be
matched to the columns of the mapper, the UnevaluatableError is
still raised, which is what was fixed in :ticket:`3366`.
.. change::
:tags: bug, sql
:tickets: 4087
Fixed bug in new SQL comments feature where table and column comment
would not be copied when using :meth:`_schema.Table.tometadata`.
.. change::
:tags: bug, sql
:tickets: 4102
In release 1.1, the :class:`.Boolean` type was broken in that
boolean coercion via ``bool()`` would occur for backends that did not
feature "native boolean", but would not occur for native boolean backends,
meaning the string ``"0"`` now behaved inconsistently. After a poll, a
consensus was reached that non-boolean values should be raising an error,
especially in the ambiguous case of string ``"0"``; so the :class:`.Boolean`
datatype will now raise ``ValueError`` if an incoming value is not
within the range ``None, True, False, 1, 0``.
.. seealso::
:ref:`change_4102`
.. change::
:tags: bug, sql
:tickets: 4063
Refined the behavior of :meth:`.Operators.op` such that in all cases,
if the :paramref:`.Operators.op.is_comparison` flag is set to True,
the return type of the resulting expression will be
:class:`.Boolean`, and if the flag is False, the return type of the
resulting expression will be the same type as that of the left-hand
expression, which is the typical default behavior of other operators.
Also added a new parameter :paramref:`.Operators.op.return_type` as well
as a helper method :meth:`.Operators.bool_op`.
.. seealso::
:ref:`change_4063`
.. change::
:tags: bug, mysql
:tickets: 4072
Changed the name of the ``.values`` attribute of the new MySQL
INSERT..ON DUPLICATE KEY UPDATE construct to ``.inserted``, as
:class:`_expression.Insert` already has a method called :meth:`_expression.Insert.values`.
The ``.inserted`` attribute ultimately renders the MySQL ``VALUES()``
function.
.. change::
:tags: bug, mssql, orm
:tickets: 4062
Added a new class of "rowcount support" for dialects that is specific to
when "RETURNING", which on SQL Server looks like "OUTPUT inserted", is in
use, as the PyODBC backend isn't able to give us rowcount on an UPDATE or
DELETE statement when OUTPUT is in effect. This primarily affects the ORM
when a flush is updating a row that contains server-calculated values,
raising an error if the backend does not return the expected row count.
PyODBC now states that it supports rowcount except if OUTPUT.inserted is
present, which is taken into account by the ORM during a flush as to
whether it will look for a rowcount.
.. change::
:tags: bug, sql
:tickets: 4088
Internal refinements to the :class:`.Enum`, :class:`.Interval`, and
:class:`.Boolean` types, which now extend a common mixin
:class:`.Emulated` that indicates a type that provides Python-side
emulation of a DB native type, switching out to the DB native type when
a supporting backend is in use. The PostgreSQL
:class:`_postgresql.INTERVAL` type when used directly will now include
the correct type coercion rules for SQL expressions that also take
effect for :class:`_types.Interval` (such as adding a date to an
interval yields a datetime).
.. change::
:tags: bug, mssql, orm
Enabled the "sane_rowcount" flag for the pymssql dialect, indicating
that the DBAPI now reports the correct number of rows affected from
an UPDATE or DELETE statement. This impacts mostly the ORM versioning
feature in that it now can verify the number of rows affected on a
target version.
.. change:: 4028
:tags: bug, engine
:tickets: 4028
Made some adjustments to :class:`_pool.Pool` and :class:`_engine.Connection` such
that recovery logic is not run underneath exception catches for
``pool.Empty``, ``AttributeError``, since when the recovery operation
itself fails, Python 3 creates a misleading stack trace referring to the
``Empty`` / ``AttributeError`` as the cause, when in fact these exception
catches are part of control flow.
.. change::
:tags: bug, oracle
:tickets: 4076
Fixed bug where Oracle 8 "non ansi" join mode would not add the
``(+)`` operator to expressions that used an operator other than the
``=`` operator. The ``(+)`` needs to be on all columns that are part
of the right-hand side.
.. change::
:tags: bug, mssql
:tickets: 4059
Added a rule to SQL Server index reflection to ignore the so-called
"heap" index that is implicitly present on a table that does not
specify a clustered index.
.. changelog::