Releases: sqlalchemy/alembic
1.8.1
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 fixedTable
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,
aTable
object should be passed to the
Operations.batch_alter_table.copy_from
parameter so that
reflection may be skipped.References: #1021
1.8.0
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()
andafter_drop()
DDL event hooks at the table level,
which is similar to how thebefore_create()
andafter_create()
hooks are triggered by theop.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 thefile_template
option, which will
populate the integer epoch as determined byint(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
1.7.7
Released: March 14, 2022
bug
-
[bug] [operations] Fixed issue where using
Operations.create_table()
in conjunction
with aCheckConstraint
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 inenv.py
templates, which is used
to setup Python logging for the migration run, is now conditional on
Config.config_file_name
not beingNone
. 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"). AnOperations.alter_column()
operation
that specifiesOperations.alter_column.type
should also
specify include eitherOperations.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
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 theexisting_type
option ofop.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
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
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.9References: #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
1.7.2
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 runningexec()
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 theexec()
can proceed.References: #920
1.7.1
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 anadd_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
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 thetimezone
option
is used in the Alembic configuration.
An extra require namedtz
is available with
pip install alembic[tz]
to install it.References: #674
-
[changed] [installation] The dependency on
pkg_resources
which is part ofsetuptools
has
been removed, so there is no longer any runtime dependency on
setuptools
. The functionality has been replaced with
importlib.metadata
andimportlib.resources
which are both part of
Python std.lib, or via pypy dependencyimportlib-metadata
for Python
version < 3.8 andimportlib-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 optionversion_path_separator
specifies the
character to use when splitting theversion_locations
string. The
default for new configurations isversion_path_separator = os
,
which will useos.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 modulesalembic.op
andalembic.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 usingop.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
andEnum
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 additionalop.drop_constraint()
directive should be added for
that named constraint as there will no longer be an associated column
for it; for theBoolean
andEnum
datatypes, anexisting_type
keyword may be passed toBatchOperations.drop_constraint
as well.References: #884
bug
-
[bug] [operations] Fixed regression due to #803 where the
.info
and.comment
attributes ofTable
would be lost inside of theDropTableOp
class, which when "reversed" into aCreateTableOp
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 aComputed
(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 aOperations.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