Skip to content

Releases: sqlalchemy/alembic

1.8.1

13 Jul 14:18
Compare
Choose a tag to compare

1.8.1

Released: July 13, 2022

bug

  • [bug] [sqlite] Fixed bug where the SQLite implementation of
    Operations.rename_table() would render an explicit schema name for
    both the old and new table name, which while is the standard ALTER syntax,
    is not accepted by SQLite's syntax which doesn't support a rename across
    schemas. In particular, the syntax issue would prevent batch mode from
    working for SQLite databases that made use of attached databases (which are
    treated as "schemas" in SQLAlchemy).

    References: #1065

  • [bug] [batch] Added an error raise for the condition where
    Operations.batch_alter_table() is used in --sql mode, where the
    operation requires table reflection, as is the case when running against
    SQLite without giving it a fixed Table object. Previously the operation
    would fail with an internal error. To get a "move and copy" batch
    operation as a SQL script without connecting to a database,
    a Table object should be passed to the
    Operations.batch_alter_table.copy_from parameter so that
    reflection may be skipped.

    References: #1021

1.8.0

31 May 21:13
Compare
Choose a tag to compare

1.8.0

Released: May 31, 2022

changed

  • [changed] [installation] Alembic 1.8 now supports Python 3.7 and above.

    References: #1025

  • [changed] [environment] The "Pylons" environment template has been removed as of Alembic 1.8. This
    template was based on the very old pre-Pyramid Pylons web framework which
    has been long superseded by Pyramid.

    References: #987

feature

  • [feature] [typing] PEP 484 typing annotations have been added to the env.py and
    revision template files within migration templates. Pull request by Nikita
    Sobolev.

    References: #764

usecase

  • [usecase] [operations] The op.drop_table() operation directive will now trigger the
    before_drop() and after_drop() DDL event hooks at the table level,
    which is similar to how the before_create() and after_create()
    hooks are triggered by the op.create_table() directive. Note that as
    op.drop_table() accepts only a table name and optional schema name, the
    Table object received by the event will not have any information within
    it other than the table name and schema name.

    References: #1037

  • [usecase] [commands] Added new token epoch to the file_template option, which will
    populate the integer epoch as determined by int(create_date.timestamp()).
    Pull request courtesy Caio Carvalho.

    References: #1027

bug

  • [bug] [revisioning] Fixed issue where a downgrade using a relative revision would
    fail in case of multiple branches with a single effectively
    head due to interdependencies between revisions.

    References: #1026

  • [bug] [batch] Fixed issue in batch mode where CREATE INDEX would not use a new column
    name in the case of a column rename.

    References: #1034

1.7.7

14 Mar 19:41
Compare
Choose a tag to compare

1.7.7

Released: March 14, 2022

bug

  • [bug] [operations] Fixed issue where using Operations.create_table() in conjunction
    with a CheckConstraint that referred to table-bound
    Column objects rather than string expressions would be added to
    the parent table potentially multiple times, resulting in an incorrect DDL
    sequence. Pull request courtesy Nicolas CANIART.

    References: #1004

  • [bug] [environment] The logging.fileConfig() line in env.py templates, which is used
    to setup Python logging for the migration run, is now conditional on
    Config.config_file_name not being None. Otherwise, the line
    is skipped as there is no default logging configuration present.

    References: #986

  • [bug] [mssql] Fixed bug where an Operations.alter_column() operation would change
    a "NOT NULL" column to "NULL" by emitting an ALTER COLUMN statement that
    did not specify "NOT NULL". (In the absence of "NOT NULL" T-SQL was
    implicitly assuming "NULL"). An Operations.alter_column() operation
    that specifies Operations.alter_column.type should also
    specify include either Operations.alter_column.nullable or
    Operations.alter_column.existing_nullable to inform Alembic as
    to whether the emitted DDL should include "NULL" or "NOT NULL"; a warning
    is now emitted if this is missing under this scenario.

    References: #977

1.7.6

01 Feb 15:02
Compare
Choose a tag to compare

1.7.6

Released: February 1, 2022

usecase

  • [usecase] [commands] Add a new command alembic ensure_version, which will ensure that the
    Alembic version table is present in the target database, but does not
    alter its contents. Pull request courtesy Kai Mueller.

    References: #964

bug

  • [bug] [batch] [regression] Fixed regression where usage of a with_variant() datatype in
    conjunction with the existing_type option of op.alter_column()
    under batch mode would lead to an internal exception.

    References: #982

  • [bug] [autogenerate] Implemented support for recognizing and rendering SQLAlchemy "variant"
    types going forward into SQLAlchemy 2.0, where the architecture of
    "variant" datatypes will be changing.

  • [bug] [autogenerate] [mysql] Added a rule to the MySQL impl so that the translation between JSON /
    LONGTEXT is accommodated by autogenerate, treating LONGTEXT from the server
    as equivalent to an existing JSON in the model.

    References: #968

misc

  • [mssql] Removed a warning raised by SQLAlchemy when dropping constraints
    on MSSQL regarding statement caching.

1.7.5

11 Nov 15:56
Compare
Choose a tag to compare

1.7.5

Released: November 11, 2021

bug

  • [bug] [tests] Adjustments to the test suite to accommodate for error message changes
    occurring as of SQLAlchemy 1.4.27.

1.7.4

06 Oct 14:31
Compare
Choose a tag to compare

1.7.4

Released: October 6, 2021

bug

  • [bug] [regression] Fixed a regression that prevented the use of post write hooks
    on python version lower than 3.9

    References: #934

  • [bug] [environment] Fixed issue where the MigrationContext.autocommit_block() feature
    would fail to function when using a SQLAlchemy engine using 2.0 future
    mode.

    References: #944

1.7.3

17 Sep 15:29
Compare
Choose a tag to compare

1.7.3

Released: September 17, 2021

bug

  • [bug] [mypy] Fixed type annotations for the "constraint_name" argument of operations
    create_primary_key(), create_foreign_key(). Pull request courtesy
    TilmanK.

    References: #914

1.7.2

17 Sep 14:06
Compare
Choose a tag to compare

1.7.2

Released: September 17, 2021

bug

  • [bug] [typing] Added missing attributes from context stubs.

    References: #900

  • [bug] [mypy] Fixed an import in one of the .pyi files that was triggering an
    assertion error in some versions of mypy.

    References: #897

  • [bug] [ops] [regression] Fixed issue where registration of custom ops was prone to failure due to
    the registration process running exec() on generated code that as of
    the 1.7 series includes pep-484 annotations, which in the case of end user
    code would result in name resolution errors when the exec occurs. The logic
    in question has been altered so that the annotations are rendered as
    forward references so that the exec() can proceed.

    References: #920

1.7.1

30 Aug 21:51
Compare
Choose a tag to compare

1.7.1

Released: August 30, 2021

bug

  • [bug] [installation] Corrected "universal wheel" directive in setup.cfg so that building a wheel
    does not target Python 2. The PyPi files index for 1.7.0 was corrected
    manually. Pull request courtesy layday.

    References: #893

  • [bug] [pep484] Fixed issue in generated .pyi files where default values for Optional
    arguments were missing, thereby causing mypy to consider them as required.

    References: #895

  • [bug] [batch] [regression] Fixed regression in batch mode due to #883 where the "auto" mode
    of batch would fail to accommodate any additional migration directives
    beyond encountering an add_column() directive, due to a mis-application
    of the conditional logic that was added as part of this change, leading to
    "recreate" mode not being used in cases where it is required for SQLite
    such as for unique constraints.

    References: #896

1.7.0

30 Aug 15:12
Compare
Choose a tag to compare

1.7.0

Released: August 30, 2021

changed

  • [changed] [installation] Alembic 1.7 now supports Python 3.6 and above; support for prior versions
    including Python 2.7 has been dropped.

  • [changed] [installation] Make the python-dateutil library an optional dependency.
    This library is only required if the timezone option
    is used in the Alembic configuration.
    An extra require named tz is available with
    pip install alembic[tz] to install it.

    References: #674

  • [changed] [installation] The dependency on pkg_resources which is part of setuptools has
    been removed, so there is no longer any runtime dependency on
    setuptools. The functionality has been replaced with
    importlib.metadata and importlib.resources which are both part of
    Python std.lib, or via pypy dependency importlib-metadata for Python
    version < 3.8 and importlib-resources for Python version < 3.9
    (while importlib.resources was added to Python in 3.7, it did not include
    the "files" API until 3.9).

    References: #885

feature

  • [feature] [environment] Enhance version_locations parsing to handle paths containing spaces.
    The new configuration option version_path_separator specifies the
    character to use when splitting the version_locations string. The
    default for new configurations is version_path_separator = os,
    which will use os.pathsep (e.g., ; on Windows).

    References: #842

  • [feature] [tests] Created a "test suite" similar to the one for SQLAlchemy, allowing
    developers of third-party dialects to test their code against a set of
    Alembic tests that have been specially selected to exercise
    back-end database operations. At the time of release,
    third-party dialects that have adopted the Alembic test suite to verify
    compatibility include
    CockroachDB and
    SAP ASE (Sybase).

    References: #855

  • [feature] [general] pep-484 type annotations have been added throughout the library.
    Additionally, stub .pyi files have been added for the "dynamically"
    generated Alembic modules alembic.op and alembic.config, which
    include complete function signatures and docstrings, so that the functions
    in these namespaces will have both IDE support (vscode, pycharm, etc) as
    well as support for typing tools like Mypy. The files themselves are
    statically generated from their source functions within the source tree.

usecase

  • [usecase] [batch] Named CHECK constraints are now supported by batch mode, and will
    automatically be part of the recreated table assuming they are named. They
    also can be explicitly dropped using op.drop_constraint(). For
    "unnamed" CHECK constraints, these are still skipped as they cannot be
    distinguished from the CHECK constraints that are generated by the
    Boolean and Enum datatypes.

    Note that this change may require adjustments to migrations that drop or
    rename columns which feature an associated named check constraint, such
    that an additional op.drop_constraint() directive should be added for
    that named constraint as there will no longer be an associated column
    for it; for the Boolean and Enum datatypes, an existing_type
    keyword may be passed to BatchOperations.drop_constraint as well.

    References: #884

bug

  • [bug] [operations] Fixed regression due to #803 where the .info and .comment
    attributes of Table would be lost inside of the DropTableOp
    class, which when "reversed" into a CreateTableOp would then have
    lost these elements. Pull request courtesy Nicolas CANIART.

    References: #879

  • [bug] [batch] [sqlite] Batch "auto" mode will now select for "recreate" if the add_column()
    operation is used on SQLite, and the column itself meets the criteria for
    SQLite where ADD COLUMN is not allowed, in this case a functional or
    parenthesized SQL expression or a Computed (i.e. generated) column.

    References: #883

  • [bug] [commands] Re-implemented the python-editor dependency as a small internal
    function to avoid the need for external dependencies.

    References: #856

  • [bug] [postgresql] Fixed issue where usage of the PostgreSQL postgresql_include option
    within a Operations.create_index() would raise a KeyError, as the
    additional column(s) need to be added to the table object used by the
    construct internally. The issue is equivalent to the SQL Server issue fixed
    in #513. Pull request courtesy Steven Bronson.

    References: #874