Skip to content

Releases: sqlalchemy/alembic

0.6.7

17 Sep 22:10
Compare
Choose a tag to compare

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 SQLAlchemy text() construct can be sent, embedding a literal
    SQL expression; the Operations.create_index() will perform some hackery
    behind the scenes to get the Index construct to cooperate.
    This works around some current limitations in Index
    which should be resolved on the SQLAlchemy side at some point.

    References: #222

0.6.6

17 Sep 22:10
Compare
Choose a tag to compare

0.6.6

Released: August 7, 2014

  • [bug] A file named __init__.py in the versions/ 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 using log.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 a EnvironmentContext and
    Config, this config will be returned. Patch
    courtesy Marc Abramowitz.

0.6.5

17 Sep 22:10
Compare
Choose a tag to compare

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 original Column 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 the Config 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 the f()
    construct when the index contained a convention-driven name.

    References: #194

0.6.4

17 Sep 22:10
Compare
Choose a tag to compare

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 like head; 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 when Operations.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 the Script
    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

17 Sep 22:10
Compare
Choose a tag to compare

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 if ioctl() 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 to None, in
    which case the EnvironmentContext.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 explicit schema attribute
    whose name matches that of the connection's default schema
    (e.g. "public" for Postgresql). Previously, it was assumed that "schema"
    was None 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,
    and EnvironmentContext.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 a versions/ 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

17 Sep 22:11
Compare
Choose a tag to compare

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(). Like mssql_drop_default
    and mssql_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
    use Operations.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 final COMMIT statement, to ensure
    that statement is also processed in batch mode. Courtesy
    Derek Harland.

0.6.1

17 Sep 22:11
Compare
Choose a tag to compare

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 that DEFERRABLE 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

17 Sep 22:11
Compare
Choose a tag to compare

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 the argparse 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 an env.py script by looking at
    context.config.cmd_opts.x, or more simply a new
    method EnvironmentContext.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 to alembic 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

17 Sep 22:11
Compare
Choose a tag to compare

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
    to EnvironmentContext.configure(),
    complements the version_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 an sp_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 compatibility

    References: #104

0.4.2

17 Sep 22:11
Compare
Choose a tag to compare

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