1.3.9
Released: October 4, 2019
-
[engine] [usecase] Added new
create_engine()
parameter
create_engine.max_identifier_length
. This overrides the
dialect-coded "max identifier length" in order to accommodate for databases
that have recently changed this length and the SQLAlchemy dialect has
not yet been adjusted to detect for that version. This parameter interacts
with the existingcreate_engine.label_length
parameter in that
it establishes the maximum (and default) value for anonymously generated
labels. Additionally, post-connection detection of max identifier lengths
has been added to the dialect system. This feature is first being used
by the Oracle dialect.References: #4857
-
[oracle] [usecase] The Oracle dialect now emits a warning if Oracle version 12.2 or greater is
used, and thecreate_engine.max_identifier_length
parameter is
not set. The version in this specific case defaults to that of the
"compatibility" version set in the Oracle server configuration, not the
actual server version. In version 1.4, the default max_identifier_length
for 12.2 or greater will move to 128 characters. In order to maintain
forwards compatibility, applications should set
create_engine.max_identifier_length
to 30 in order to maintain
the same length behavior, or to 128 in order to test the upcoming behavior.
This length determines among other things how generated constraint names
are truncated for statements likeCREATE CONSTRAINT
andDROP CONSTRAINT
, which means a the new length may produce a name-mismatch
against a name that was generated with the old length, impacting database
migrations.References: #4857
-
[sqlite] [usecase] Added support for sqlite "URI" connections, which allow for sqlite-specific
flags to be passed in the query string such as "read only" for Python
sqlite3 drivers that support this.References: #4863
-
[bug] [tests] Fixed unit test regression released in 1.3.8 that would cause failure for
Oracle, SQL Server and other non-native ENUM platforms due to new
enumeration tests added as part of #4285 enum sortability in the
unit of work; the enumerations created constraints that were duplicated on
name.References: #4285
-
[bug] [oracle] Restored adding cx_Oracle.DATETIME to the setinputsizes() call when a
SQLAlchemyDate
,DateTime
orTime
datatype is
used, as some complex queries require this to be present. This was removed
in the 1.2 series for arbitrary reasons.References: #4886
-
[bug] [mssql] Added identifier quoting to the schema name applied to the "use" statement
which is invoked when a SQL Server multipart schema name is used within a
Table
that is being reflected, as well as forInspector
methods such asInspector.get_table_names()
; this accommodates for
special characters or spaces in the database name. Additionally, the "use"
statement is not emitted if the current database matches the target owner
database name being passed.References: #4883
-
[bug] [orm] Fixed regression in selectinload loader strategy caused by #4775
(released in version 1.3.6) where a many-to-one attribute of None would no
longer be populated by the loader. While this was usually not noticeable
due to the lazyloader populating None upon get, it would lead to a detached
instance error if the object were detached.References: #4872
-
[bug] [orm] Passing a plain string expression to
Session.query()
is deprecated,
as all string coercions were removed in #4481 and this one should
have been included. Theliteral_column()
function may be used to
produce a textual column expression.References: #4873
-
[sql] [usecase] Added an explicit error message for the case when objects passed to
Table
are notSchemaItem
objects, rather than resolving
to an attribute error.References: #4847
-
[bug] [orm] A warning is emitted for a condition in which the
Session
may
implicitly swap an object out of the identity map for another one with the
same primary key, detaching the old one, which can be an observed result of
load operations which occur within theSessionEvents.after_flush()
hook. The warning is intended to notify the user that some special
condition has caused this to happen and that the previous object may not be
in the expected state.References: #4890
-
[bug] [sql] Characters that interfere with "pyformat" or "named" formats in bound
parameters, namely%, (, )
and the space character, as well as a few
other typically undesirable characters, are stripped early for a
bindparam()
that is using an anonymized name, which is typically
generated automatically from a named column which itself includes these
characters in its name and does not use a.key
, so that they do not
interfere either with the SQLAlchemy compiler's use of string formatting or
with the driver-level parsing of the parameter, both of which could be
demonstrated before the fix. The change only applies to anonymized
parameter names that are generated and consumed internally, not end-user
defined names, so the change should have no impact on any existing code.
Applies in particular to the psycopg2 driver which does not otherwise quote
special parameter names, but also strips leading underscores to suit Oracle
(but not yet leading numbers, as some anon parameters are currently
entirely numeric/underscore based); Oracle in any case continues to quote
parameter names that include special characters.References: #4837