Releases: sqlalchemy/alembic
0.6.7
0.6.7
Released: September 9, 2014
-
[bug] [mssql] Fixed bug in MSSQL dialect where "rename table" wasn't using
sp_rename()
as is required on SQL Server. Pull request courtesy
Łukasz Bołdys. -
[feature] Added support for functional indexes when using the
Operations.create_index()
directive. Within the list of columns,
the SQLAlchemytext()
construct can be sent, embedding a literal
SQL expression; theOperations.create_index()
will perform some hackery
behind the scenes to get theIndex
construct to cooperate.
This works around some current limitations inIndex
which should be resolved on the SQLAlchemy side at some point.References: #222
0.6.6
0.6.6
Released: August 7, 2014
-
[bug] A file named
__init__.py
in theversions/
directory is now
ignored by Alembic when the collection of version files is retrieved.
Pull request courtesy Michael Floering.References: #95
-
[bug] Fixed Py3K bug where an attempt would be made to sort None against
string values when autogenerate would detect tables across multiple
schemas, including the default schema. Pull request courtesy
paradoxxxzero. -
[bug] Autogenerate render will render the arguments within a Table construct
using*[...]
when the number of columns/elements is greater than
255. Pull request courtesy Ryan P. Kelly. -
[bug] Fixed bug where foreign key constraints would fail to render in
autogenerate when a schema name was present. Pull request courtesy
Andreas Zeidler. -
[bug] Some deep-in-the-weeds fixes to try to get "server default" comparison
working better across platforms and expressions, in particular on
the Postgresql backend, mostly dealing with quoting/not quoting of various
expressions at the appropriate time and on a per-backend basis.
Repaired and tested support for such defaults as Postgresql interval
and array defaults.References: #212
-
[enhancement] When a run of Alembic command line fails due to
CommandError
,
the output now prefixes the string with"FAILED:"
, and the error
is also written to the log output usinglog.error()
.References: #209
-
[bug] Liberalized even more the check for MySQL indexes that shouldn't be
counted in autogenerate as "drops"; this time it's been reported
that an implicitly created index might be named the same as a composite
foreign key constraint, and not the actual columns, so we now skip those
when detected as well.References: #208
-
[feature] Added a new accessor
MigrationContext.config
, when used
in conjunction with aEnvironmentContext
and
Config
, this config will be returned. Patch
courtesy Marc Abramowitz.
0.6.5
0.6.5
Released: May 3, 2014
-
[autogenerate] [bug] [mysql] This releases' "autogenerate index detection" bug, when a MySQL table
includes an Index with the same name as a column, autogenerate reported
it as an "add" even though its not; this is because we ignore reflected
indexes of this nature due to MySQL creating them implicitly. Indexes
that are named the same as a column are now ignored on
MySQL if we see that the backend is reporting that it already exists;
this indicates that we can still detect additions of these indexes
but not drops, as we cannot distinguish a backend index same-named
as the column as one that is user generated or mysql-generated.References: #202
-
[environment] [feature] Added new feature
EnvironmentContext.configure.transaction_per_migration
,
which when True causes the BEGIN/COMMIT pair to incur for each migration
individually, rather than for the whole series of migrations. This is
to assist with some database directives that need to be within individual
transactions, without the need to disable transactional DDL entirely.References: #201
-
[autogenerate] [bug] Fixed bug where the
include_object()
filter would not receive
the originalColumn
object when evaluating a database-only
column to be dropped; the object would not include the parent
Table
nor other aspects of the column that are important
for generating the "downgrade" case where the column is recreated.References: #200
-
[bug] [environment] Fixed bug where
EnvironmentContext.get_x_argument()
would fail if theConfig
in use didn't actually
originate from a command line call.References: #195
-
[autogenerate] [bug] Fixed another bug regarding naming conventions, continuing
from #183, where add_index()
drop_index() directives would not correctly render thef()
construct when the index contained a convention-driven name.References: #194
0.6.4
0.6.4
Released: March 28, 2014
-
[bug] [mssql] Added quoting to the table name when the special EXEC is run to
drop any existing server defaults or constraints when the
drop_column.mssql_drop_check
or
drop_column.mssql_drop_default
arguments are used.References: #186
-
[bug] [mysql] Added/fixed support for MySQL "SET DEFAULT" / "DROP DEFAULT" phrases,
which will now be rendered if only the server default is changing
or being dropped (e.g. specify None to alter_column() to indicate
"DROP DEFAULT"). Also added support for rendering MODIFY rather than
CHANGE when the column name isn't changing.References: #103
-
[bug] Added support for the
initially
,match
keyword arguments
as well as dialect-specific keyword arguments to
Operations.create_foreign_key()
.tagsfeature
tickets163
Altered the support for "sourceless" migration files (e.g. only
.pyc or .pyo present) so that the flag "sourceless=true" needs to
be in alembic.ini for this behavior to take effect.References: #190
-
[bug] [mssql] The feature that keeps on giving, index/unique constraint autogenerate
detection, has even more fixes, this time to accommodate database dialects
that both don't yet report on unique constraints, but the backend
does report unique constraints as indexes. The logic
Alembic uses to distinguish between "this is an index!" vs.
"this is a unique constraint that is also reported as an index!" has now
been further enhanced to not produce unwanted migrations when the dialect
is observed to not yet implement get_unique_constraints() (e.g. mssql).
Note that such a backend will no longer report index drops for unique
indexes, as these cannot be distinguished from an unreported unique
index.References: #185
-
[bug] Extensive changes have been made to more fully support SQLAlchemy's new
naming conventions feature. Note that while SQLAlchemy has added this
feature as of 0.9.2, some additional fixes in 0.9.4 are needed to
resolve some of the issues:- The `Operations` object now takes into account the naming conventions that are present on the `MetaData` object that's associated using `~.EnvironmentContext.configure.target_metadata`. When `Operations` renders a constraint directive like `ADD CONSTRAINT`, it now will make use of this naming convention when it produces its own temporary `MetaData` object. - Note however that the autogenerate feature in most cases generates constraints like foreign keys and unique constraints with the final names intact; the only exception are the constraints implicit with a schema-type like Boolean or Enum. In most of these cases, the naming convention feature will not take effect for these constraints and will instead use the given name as is, with one exception.... - Naming conventions which use the `"%(constraint_name)s"` token, that is, produce a new name that uses the original name as a component, will still be pulled into the naming convention converter and be converted. The problem arises when autogenerate renders a constraint with it's already-generated name present in the migration file's source code, the name will be doubled up at render time due to the combination of #1 and #2. So to work around this, autogenerate now renders these already-tokenized names using the new `Operations.f()` component. This component is only generated if **SQLAlchemy 0.9.4** or greater is in use.
Therefore it is highly recommended that an upgrade to Alembic 0.6.4
be accompanied by an upgrade of SQLAlchemy 0.9.4, if the new naming
conventions feature is used.References: #183
-
[bug] Suppressed IOErrors which can raise when program output pipe
is closed under a program likehead
; however this only
works on Python 2. On Python 3, there is not yet a known way to
suppress the BrokenPipeError warnings without prematurely terminating
the program via signals.References: #160
-
[bug] Fixed bug where
Operations.bulk_insert()
would not function
properly whenOperations.inline_literal()
values were used,
either in --sql or non-sql mode. The values will now render
directly in --sql mode. For compatibility with "online" mode,
a new flag~.Operations.bulk_insert.multiinsert
can be set to False which will cause each parameter set to be
compiled and executed with individual INSERT statements.References: #179
-
[bug] [py3k] Fixed a failure of the system that allows "legacy keyword arguments"
to be understood, which arose as of a change in Python 3.4 regarding
decorators. A workaround is applied that allows the code to work
across Python 3 versions.References: #175
-
[feature] The
command.revision()
command now returns theScript
object corresponding to the newly generated revision. From this
structure, one can get the revision id, the module documentation,
and everything else, for use in scripts that call upon this command.
Pull request courtesy Robbie Coomber.
0.6.3
0.6.3
Released: February 2, 2014
-
[bug] Added a workaround for when we call
fcntl.ioctl()
to get at
TERMWIDTH
; if the function returns zero, as is reported to occur
in some pseudo-ttys, the message wrapping system is disabled in the
same way as ifioctl()
failed.References: #172
-
[feature] Added new argument
EnvironmentContext.configure.user_module_prefix
.
This prefix is applied when autogenerate renders a user-defined type,
which here is defined as any type that is from a module outside of the
sqlalchemy.
hierarchy. This prefix defaults toNone
, in
which case theEnvironmentContext.configure.sqlalchemy_module_prefix
is used, thus preserving the current behavior.References: #171
-
[bug] Added support for autogenerate covering the use case where
Table
objects specified in the metadata have an explicitschema
attribute
whose name matches that of the connection's default schema
(e.g. "public" for Postgresql). Previously, it was assumed that "schema"
wasNone
when it matched the "default" schema, now the comparison
adjusts for this.References: #170
-
[bug] The
compare_metadata()
public API function now takes into
account the settings for
EnvironmentContext.configure.include_object
,
EnvironmentContext.configure.include_symbol
,
andEnvironmentContext.configure.include_schemas
, in the
same way that the--autogenerate
command does. Pull
request courtesy Roman Podoliaka. -
[bug] Calling
bulk_insert()
with an empty list will not emit any
commands on the current connection. This was already the case with
--sql
mode, so is now the case with "online" mode.References: #168
-
[bug] Enabled schema support for index and unique constraint autodetection;
previously these were non-functional and could in some cases lead to
attribute errors. Pull request courtesy Dimitris Theodorou. -
[bug] More fixes to index autodetection; indexes created with expressions
like DESC or functional indexes will no longer cause AttributeError
exceptions when attempting to compare the columns.References: #164
-
[feature] The
ScriptDirectory
system that loads migration files
from aversions/
directory now supports so-called
"sourceless" operation, where the.py
files are not present
and instead.pyc
or.pyo
files are directly present where
the.py
files should be. Note that while Python 3.3 has a
new system of locating.pyc
/.pyo
files within a directory
called__pycache__
(e.g. PEP-3147), PEP-3147 maintains
support for the "source-less imports" use case, where the
.pyc
/.pyo
are in present in the "old" location, e.g. next
to the.py
file; this is the usage that's supported even when
running Python3.3.References: #163
0.6.2
0.6.2
Released: Fri Dec 27 2013
-
[bug] Autogenerate for
op.create_table()
will not include a
PrimaryKeyConstraint()
that has no columns. -
[bug] Fixed bug in the not-internally-used
ScriptDirectory.get_base()
method which would fail if called on an empty versions directory. -
[bug] An almost-rewrite of the new unique constraint/index autogenerate
detection, to accommodate a variety of issues. The emphasis is on
not generating false positives for those cases where no net change
is present, as these errors are the ones that impact all autogenerate
runs:- Fixed an issue with unique constraint autogenerate detection where a named `UniqueConstraint` on both sides with column changes would render with the "add" operation before the "drop", requiring the user to reverse the order manually. - Corrected for MySQL's apparent addition of an implicit index for a foreign key column, so that it doesn't show up as "removed". This required that the index/constraint autogen system query the dialect-specific implementation for special exceptions. - reworked the "dedupe" logic to accommodate MySQL's bi-directional duplication of unique indexes as unique constraints, and unique constraints as unique indexes. Postgresql's slightly different logic of duplicating unique constraints into unique indexes continues to be accommodated as well. Note that a unique index or unique constraint removal on a backend that duplicates these may show up as a distinct "remove_constraint()" / "remove_index()" pair, which may need to be corrected in the post-autogenerate if multiple backends are being supported. - added another dialect-specific exception to the SQLite backend when dealing with unnamed unique constraints, as the backend can't currently report on constraints that were made with this technique, hence they'd come out as "added" on every run. - the `op.create_table()` directive will be auto-generated with the `UniqueConstraint` objects inline, but will not double them up with a separate `create_unique_constraint()` call, which may have been occurring. Indexes still get rendered as distinct `op.create_index()` calls even when the corresponding table was created in the same script. - the inline `UniqueConstraint` within `op.create_table()` includes all the options like `deferrable`, `initially`, etc. Previously these weren't rendering.
References: #157
-
[feature] [mssql] Added new argument
mssql_drop_foreign_key
to
Operations.drop_column()
. Likemssql_drop_default
andmssql_drop_check
, will do an inline lookup for a
single foreign key which applies to this column, and drop it.
For a column with more than one FK, you'd still need to explicitly
useOperations.drop_constraint()
given the name,
even though only MSSQL has this limitation in the first place. -
[bug] [mssql] The MSSQL backend will add the batch separator (e.g.
"GO"
)
in--sql
mode after the finalCOMMIT
statement, to ensure
that statement is also processed in batch mode. Courtesy
Derek Harland.
0.6.1
0.6.1
Released: Wed Nov 27 2013
-
[bug] [mysql] Fixed bug where
op.alter_column()
in the MySQL dialect
would fail to apply quotes to column names that had mixed casing
or spaces.References: #152
-
[feature] Expanded the size of the "slug" generated by "revision" to 40
characters, which is also configurable by new field
truncate_slug_length
; and also split on the word rather than the
character; courtesy Frozenball. -
[bug] Fixed the output wrapping for Alembic message output, so that
we either get the terminal width for "pretty printing" with
indentation, or if not we just output the text as is; in any
case the text won't be wrapped too short.References: #135
-
[bug] Fixes to Py3k in-place compatibity regarding output encoding and related;
the use of the new io.* package introduced some incompatibilities on Py2k.
These should be resolved, due to the introduction of new adapter types
for translating from io.* to Py2k file types, StringIO types.
Thanks to Javier Santacruz for help with this. -
[bug] Fixed py3k bug where the wrong form of
next()
was being called
when using the list_templates command. Courtesy Chris Wilkes.References: #145
-
[feature] Support for autogeneration detection and rendering of indexes and
unique constraints has been added. The logic goes through some effort
in order to differentiate between true unique constraints and
unique indexes, where there are some quirks on backends like Postgresql.
The effort here in producing the feature and tests is courtesy of IJL.References: #107
-
[bug] Fixed bug introduced by new
include_object
argument where the
inspected column would be misinterpreted when using a user-defined
type comparison function, causing a KeyError or similar expression-related
error. Fix courtesy Maarten van Schaik. -
[bug] Added the "deferrable" keyword argument to
op.create_foreign_key()
so thatDEFERRABLE
constraint generation is supported; courtesy
Pedro Romano. -
[bug] Ensured that strings going to stdout go through an encode/decode phase,
so that any non-ASCII characters get to the output stream correctly
in both Py2k and Py3k. Also added source encoding detection using
Mako's parse_encoding() routine in Py2k so that the doc of a
non-ascii revision file can be treated as unicode in Py2k.References: #137
0.6.0
0.6.0
Released: Fri July 19 2013
-
[feature] Added new kw argument to
EnvironmentContext.configure()
include_object
. This is a more flexible version of the
include_symbol
argument which allows filtering of columns as well as tables
from the autogenerate process,
and in the future will also work for types, constraints and
other constructs. The fully constructed schema object is passed,
including its name and type as well as a flag indicating if the object
is from the local application metadata or is reflected.References: #101
-
[feature] The output of the
alembic history
command is now
expanded to show information about each change on multiple
lines, including the full top message,
resembling the formatting of git log. -
[feature] Added
alembic.config.Config.cmd_opts
attribute,
allows access to theargparse
options passed to the
alembic
runner. -
[feature] Added new command line argument
-x
, allows extra arguments
to be appended to the command line which can be consumed
within anenv.py
script by looking at
context.config.cmd_opts.x
, or more simply a new
methodEnvironmentContext.get_x_argument()
.References: #120
-
[bug] Added support for options like "name" etc. to be rendered
within CHECK constraints in autogenerate. Courtesy
Sok Ann Yap.References: #125
-
[misc] Source repository has been moved from Mercurial to Git.
-
[bug] Repaired autogenerate rendering of ForeignKeyConstraint
to include use_alter argument, if present. -
[feature] Added
-r
argument toalembic history
command,
allows specification of[start]:[end]
to view
a slice of history. Accepts revision numbers, symbols
"base", "head", a new symbol "current" representing the
current migration, as well as relative ranges for one
side at a time (i.e.-r-5:head
,-rcurrent:+3
).
Courtesy Atsushi Odagiri for this feature. -
[feature] Source base is now in-place for Python 2.6 through
3.3, without the need for 2to3. Support for Python 2.5
and below has been dropped. Huge thanks to
Hong Minhee for all the effort on this!References: #55
0.5.0
0.5.0
Released: Thu Apr 4 2013Alembic 0.5.0 now requires at least
version 0.7.3 of SQLAlchemy to run properly.
Support for 0.6 has been dropped.
-
[feature] Added
version_table_schema
argument
toEnvironmentContext.configure()
,
complements theversion_table
argument to
set an optional remote schema for the version
table. Courtesy Christian Blume.References: #76
-
[bug] [postgresql] Fixed format of RENAME for table that includes
schema with Postgresql; the schema name shouldn't
be in the "TO" field.References: #32
-
[feature] Added
output_encoding
option to
EnvironmentContext.configure()
,
used with--sql
mode to apply an encoding
to the output stream.References: #90
-
[feature] Added
Operations.create_primary_key()
operation, will genenerate an ADD CONSTRAINT
for a primary key.References: #93
-
[bug] [mssql] Fixed bug whereby double quoting would be applied
to target column name during ansp_rename
operation.References: #109
-
[bug] [mysql] [sqlite] transactional_ddl flag for SQLite, MySQL dialects
set to False. MySQL doesn't support it,
SQLite does but current pysqlite driver does not.References: #112
-
[feature] upgrade and downgrade commands will list the
first line of the docstring out next to the
version number. Courtesy Hong Minhee.References: #115
-
[feature] Added --head-only option to "alembic current",
will print current version plus the symbol
"(head)" if this version is the head or not.
Courtesy Charles-Axel Dein. -
[bug] Autogenerate will render additional table keyword
arguments like "mysql_engine" and others within
op.create_table().References: #110
-
[feature] The rendering of any construct during autogenerate
can be customized, in particular to allow special rendering
for user-defined column, constraint subclasses, using new
render_item
argument to
EnvironmentContext.configure()
.References: #108
-
[bug] Fixed bug whereby create_index()
would include in the constraint columns that
are added to all Table objects using events,
externally to the generation of the constraint.
This is the same issue that was fixed for unique
constraints in version 0.3.2. -
[bug] Worked around a backwards-incompatible regression in Python3.3
regarding argparse; running "alembic" with no arguments
now yields an informative error in py3.3 as with all previous versions.
Courtesy Andrey Antukh. -
[change] SQLAlchemy 0.6 is no longer supported by Alembic - minimum version is 0.7.3,
full support is as of 0.7.9. -
[bug] A host of argument name changes within migration
operations for consistency. Keyword arguments
will continue to work on the old name for backwards compatibility,
however required positional arguments will not:Operations.alter_column()
-name
->new_column_name
- old
name will work for backwards compatibility.Operations.create_index()
-tablename
->table_name
-
argument is positional.Operations.drop_index()
-tablename
->table_name
- old
name will work for backwards compatibility.Operations.drop_constraint()
-tablename
->table_name
-
argument is positional.Operations.drop_constraint()
-type
->type_
- old
name will work for backwards compatibilityReferences: #104
0.4.2
0.4.2
Released: Fri Jan 11 2013
-
[autogenerate] [bug] Fixed bug where autogenerate would fail if a Column
to be added to a table made use of the ".key" paramter.References: #99
-
[bug] [sqlite] The "implicit" constraint generated by a
type such as Boolean or Enum will not generate an
ALTER statement when run on SQlite, which does not
support ALTER for the purpose of adding/removing
constraints separate from the column def itself.
While SQLite supports adding a CHECK constraint
at the column level, SQLAlchemy would need modification
to support this.
A warning is emitted indicating this
constraint cannot be added in this scenario.References: #98
-
[bug] Added a workaround to setup.py to prevent
"NoneType" error from occuring when
"setup.py test" is run.References: #96
-
[bug] Added an append_constraint() step to each
condition within
test_autogenerate:AutogenRenderTest.test_render_fk_constraint_kwarg
if the SQLAlchemy version is less than 0.8, as ForeignKeyConstraint
does not auto-append prior to 0.8.References: #96
-
[feature] Added a README.unittests with instructions for running the test
suite fully.References: #96