]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Merge remote-tracking branch 'github/pr/16' into pr16
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 20 Sep 2014 17:17:33 +0000 (13:17 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 20 Sep 2014 17:35:25 +0000 (13:35 -0400)
1  2 
alembic/autogenerate/compare.py
alembic/autogenerate/render.py
alembic/ddl/impl.py
tests/test_autogen_render.py

index 1a909349d12727478e81d6504db83935e7e3f710,b59816d8a0bfbd6a3c30cc3ac36c998adfd40310..bfca75e65c9d7e7446d7163b7dbfc722f079932c
@@@ -1,7 -1,8 +1,9 @@@
 -from sqlalchemy import schema as sa_schema, types as sqltypes, sql
 +from sqlalchemy import schema as sa_schema, types as sqltypes
+ from sqlalchemy.exc import NoSuchTableError
++from sqlalchemy import sql
  import logging
  from .. import compat
- from .render import _render_server_default
+ from .render import _render_server_default, _render_potential_expr
  from sqlalchemy.util import OrderedSet
  
  
index 8a086ef056db43681ab94e77835aabe4d0fc9eb8,3ecef3a4b518e5f0fc59c6a1d8ac61e408d23982..981ee1e7ddd2ed427445eb7d881a5edf716d042b
@@@ -88,34 -82,35 +88,44 @@@ def _drop_table(table, autogen_context)
      text += ")"
      return text
  
 -def _get_index_rendered_expressions(idx, autogen_context=None):
 +
++def _get_index_rendered_expressions(idx, autogen_context):
+     if compat.sqla_08:
+         return [repr(getattr(exp, "name", None))
+                 if isinstance(exp, sql.schema.Column)
+                 else _render_potential_expr(exp, autogen_context)
+                 for exp in idx.expressions]
+     else:
+         return [repr(getattr(col, "name", None)) for col in idx.columns]
++
  def _add_index(index, autogen_context):
      """
      Generate Alembic operations for the CREATE INDEX of an
      :class:`~sqlalchemy.schema.Index` instance.
      """
-     from .compare import _get_index_column_names
 +
-     text = "%(prefix)screate_index(%(name)r, '%(table)s', %(columns)s, "\
+     text = "%(prefix)screate_index(%(name)r, '%(table)s', [%(columns)s], "\
 -                    "unique=%(unique)r%(schema)s%(kwargs)s)" % {
 -        'prefix': _alembic_autogenerate_prefix(autogen_context),
 -        'name': _render_gen_name(autogen_context, index.name),
 -        'table': index.table.name,
 -        'columns': ", ".join(_get_index_rendered_expressions(index, autogen_context)),
 -        'unique': index.unique or False,
 -        'schema': (", schema='%s'" % index.table.schema) if index.table.schema else '',
 -        'kwargs': (', '+', '.join(
 -            ["%s=%s" % (key, _render_potential_expr(val, autogen_context))
 -                for key, val in index.kwargs.items()]))\
 +        "unique=%(unique)r%(schema)s%(kwargs)s)" % {
 +            'prefix': _alembic_autogenerate_prefix(autogen_context),
 +            'name': _render_gen_name(autogen_context, index.name),
 +            'table': index.table.name,
-             'columns': _get_index_column_names(index),
++            'columns': ", ".join(
++                _get_index_rendered_expressions(index, autogen_context)),
 +            'unique': index.unique or False,
 +            'schema': (", schema='%s'" % index.table.schema)
 +            if index.table.schema else '',
 +            'kwargs': (
 +                ', ' +
 +                ', '.join(
 +                    ["%s=%s" %
 +                     (key, _render_potential_expr(val, autogen_context))
 +                     for key, val in index.kwargs.items()]))
              if len(index.kwargs) else ''
 -    }
 +        }
      return text
  
 +
  def _drop_index(index, autogen_context):
      """
      Generate Alembic operations for the DROP INDEX of an
@@@ -349,21 -328,13 +359,14 @@@ def _render_server_default(default, aut
          return rendered
  
      if isinstance(default, sa_schema.DefaultClause):
-         if isinstance(default.arg, string_types):
-             default = default.arg
-         else:
-             default = str(default.arg.compile(
-                 dialect=autogen_context['dialect']))
-     if isinstance(default, string_types):
-         if repr_:
-             default = re.sub(r"^'|'$", "", default)
-             return repr(default)
-         else:
-             return default
-     else:
-         return None
+         default = _render_potential_expr(default.arg, autogen_context)
+     elif isinstance(default, string_types) and repr_:
+         default = repr(re.sub(r"^'|'$", "", default))
+     return default
  
 +
  def _repr_type(type_, autogen_context):
      rendered = _user_defined_render("type", type_, autogen_context)
      if rendered is not False:
Simple merge
index ece1617906a33e1eed5ba06b09417bb5dbcf50e7,981649cf7617ac3ff0ffd5c14586d4e6ffdb253e..c6127e830dfafac32e9577ba8954ea3341f651c1
@@@ -1,21 -1,20 +1,22 @@@
  import re
  import sys
 -from unittest import TestCase
 +from alembic.testing import TestBase
  
 -from sqlalchemy import MetaData, Column, Table, Integer, String, Text, \
 -    Numeric, CHAR, ForeignKey, DATETIME, INTEGER, \
 -    TypeDecorator, CheckConstraint, Unicode, Enum,\
 +from sqlalchemy import MetaData, Column, Table, String, \
 +    Numeric, CHAR, ForeignKey, DATETIME, Integer, \
 +    CheckConstraint, Unicode, Enum,\
      UniqueConstraint, Boolean, ForeignKeyConstraint,\
-     PrimaryKeyConstraint, Index
+     PrimaryKeyConstraint, Index, func, text
++
  from sqlalchemy.types import TIMESTAMP
  from sqlalchemy.dialects import mysql, postgresql
- from sqlalchemy.sql import and_, column, literal_column
+ from sqlalchemy.sql import and_, column, literal_column, false
  
 -from . import patch
 +from alembic.testing.mock import patch
  
  from alembic import autogenerate, util, compat
 -from . import eq_, eq_ignore_whitespace, requires_092, requires_09, requires_094
 +from alembic.testing import eq_, eq_ignore_whitespace, config
 +
  
  py3k = sys.version_info >= (3, )
  
@@@ -98,29 -95,37 +99,39 @@@ class AutogenRenderTest(TestBase)
          else:
              eq_ignore_whitespace(
                  autogenerate.render._add_index(idx, autogen_context),
 -                """op.create_index('foo_idx', 't', ['x', 'y'], unique=False, """
 -                    """postgresql_where=sa.text('t.y = %(y_1)s'))"""
 +                """op.create_index('foo_idx', 't', ['x', 'y'], \
 +unique=False, """
 +                """postgresql_where=sa.text('t.y = %(y_1)s'))"""
              )
  
-     # def test_render_add_index_func(self):
-     #     """
-     #     autogenerate.render._drop_index using func -- TODO: SQLA needs to
-     #     reflect expressions as well as columns
-     #     """
-     #     m = MetaData()
-     #     t = Table('test', m,
-     #         Column('id', Integer, primary_key=True),
-     #         Column('active', Boolean()),
-     #         Column('code', String(255)),
-     #     )
-     #     idx = Index(
-     #       'test_active_lower_code_idx', t.c.active, func.lower(t.c.code))
-     #     eq_ignore_whitespace(
-     #         autogenerate.render._add_index(idx, self.autogen_context),
-     #         ""
-     #     )
+     def test_render_add_index_func(self):
+         m = MetaData()
 -        t = Table('test', m,
++        t = Table(
++            'test', m,
+             Column('id', Integer, primary_key=True),
+             Column('code', String(255))
+         )
+         idx = Index('test_lower_code_idx', func.lower(t.c.code))
+         eq_ignore_whitespace(
+             autogenerate.render._add_index(idx, self.autogen_context),
+             "op.create_index('test_lower_code_idx', 'test', "
+             "[sa.text('lower(test.code)')], unique=False)"
+         )
+     def test_render_add_index_desc(self):
+         m = MetaData()
 -        t = Table('test', m,
++        t = Table(
++            'test', m,
+             Column('id', Integer, primary_key=True),
+             Column('code', String(255))
+         )
+         idx = Index('test_desc_code_idx', t.c.code.desc())
+         eq_ignore_whitespace(
+             autogenerate.render._add_index(idx, self.autogen_context),
+             "op.create_index('test_desc_code_idx', 'test', "
+             "[sa.text('test.code DESC')], unique=False)"
+         )
  
 -
      def test_drop_index(self):
          """
          autogenerate.render._drop_index