github sqlalchemy/sqlalchemy rel_1_3_9
1.3.9

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 existing create_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 the create_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 like CREATE CONSTRAINT and DROP 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
    SQLAlchemy Date, DateTime or Time 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 for Inspector
    methods such as Inspector.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. The literal_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 not SchemaItem 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 the SessionEvents.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

latest releases: rel_1_3_20, rel_1_3_19, rel_1_3_18...
13 months ago