object_filters=(),
include_schemas=False):
inspector = Inspector.from_engine(connection)
- # TODO: not hardcode alembic_version here ?
conn_table_names = set()
default_schema = connection.dialect.default_schema_name
else:
schemas = [None]
+ version_table_schema = autogen_context['context'].version_table_schema
+ version_table = autogen_context['context'].version_table
+
for s in schemas:
- tables = set(inspector.get_table_names(schema=s)).\
- difference(['alembic_version'])
+ tables = set(inspector.get_table_names(schema=s))
+ if s == version_table_schema:
+ tables = tables.difference(
+ [autogen_context['context'].version_table]
+ )
conn_table_names.update(zip([s] * len(tables), tables))
- metadata_table_names = OrderedSet([(table.schema, table.name)
- for table in metadata.sorted_tables])
+ metadata_table_names = OrderedSet(
+ [(table.schema, table.name) for table in metadata.sorted_tables]
+ ).difference([(version_table_schema, version_table)])
_compare_tables(conn_table_names, metadata_table_names,
object_filters,
self._user_compare_server_default = opts.get(
'compare_server_default',
False)
- version_table = opts.get('version_table', 'alembic_version')
- version_table_schema = opts.get('version_table_schema', None)
+ self.version_table = version_table = opts.get(
+ 'version_table', 'alembic_version')
+ self.version_table_schema = version_table_schema = \
+ opts.get('version_table_schema', None)
self._version = Table(
version_table, MetaData(),
Column('version_num', String(32), nullable=False),
.. changelog::
:version: 0.7.0
+ .. change::
+ :tags: bug, autogenerate
+ :tickets: 28
+
+ If the "alembic_version" table is present in the target metadata,
+ autogenerate will skip this also. Pull request courtesy
+ Dj Gilcrease.
+
+ .. change::
+ :tags: bug, autogenerate
+ :tickets: 77
+
+ The :paramref:`.EnvironmentContext.configure.version_table`
+ and :paramref:`.EnvironmentContext.configure.version_table_schema`
+ arguments are now honored during the autogenerate process, such that
+ these names will be used as the "skip" names on both the database
+ reflection and target metadata sides.
+
.. change::
:tags: changed, autogenerate
:tickets: 229
def _get_bind(cls):
return config.db
+ configure_opts = {}
+
@classmethod
def setup_class(cls):
staging_env()
cls.m2 = cls._get_model_schema()
conn = cls.bind.connect()
+ opts = cls.configure_opts.copy()
+ opts.update({
+ 'compare_type': True,
+ 'compare_server_default': True,
+ 'target_metadata': cls.m2,
+ 'upgrade_token': "upgrades",
+ 'downgrade_token': "downgrades",
+ 'alembic_module_prefix': 'op.',
+ 'sqlalchemy_module_prefix': 'sa.',
+ })
cls.context = context = MigrationContext.configure(
connection=conn,
- opts={
- 'compare_type': True,
- 'compare_server_default': True,
- 'target_metadata': cls.m2,
- 'upgrade_token': "upgrades",
- 'downgrade_token': "downgrades",
- 'alembic_module_prefix': 'op.',
- 'sqlalchemy_module_prefix': 'sa.',
- }
+ opts=opts
)
connection = context.bind
eq_(diffs[1][3].key, "otherkey")
+class AutogenVersionTableTest(AutogenTest, TestBase):
+ version_table_name = 'alembic_version'
+ version_table_schema = None
+
+ @classmethod
+ def _get_db_schema(cls):
+ m = MetaData()
+ Table(
+ cls.version_table_name, m,
+ Column('x', Integer), schema=cls.version_table_schema)
+ return m
+
+ @classmethod
+ def _get_model_schema(cls):
+ m = MetaData()
+ return m
+
+ def test_no_version_table(self):
+ diffs = []
+ autogenerate._produce_net_changes(self.context.bind, self.m2,
+ diffs, self.autogen_context)
+ eq_(diffs, [])
+
+ def test_version_table_in_target(self):
+ diffs = []
+ Table(
+ self.version_table_name,
+ self.m2, Column('x', Integer), schema=self.version_table_schema)
+
+ autogenerate._produce_net_changes(self.context.bind, self.m2,
+ diffs, self.autogen_context)
+ eq_(diffs, [])
+
+
+class AutogenCustomVersionTableSchemaTest(AutogenVersionTableTest):
+ __only_on__ = 'postgresql'
+ version_table_schema = 'test_schema'
+ configure_opts = {'version_table_schema': 'test_schema'}
+
+
+class AutogenCustomVersionTableTest(AutogenVersionTableTest):
+ version_table_name = 'my_version_table'
+ configure_opts = {'version_table': 'my_version_table'}
+
+
+class AutogenCustomVersionTableAndSchemaTest(AutogenVersionTableTest):
+ __only_on__ = 'postgresql'
+ version_table_name = 'my_version_table'
+ version_table_schema = 'test_schema'
+ configure_opts = {
+ 'version_table': 'my_version_table',
+ 'version_table_schema': 'test_schema'}
+
+
class AutogenerateDiffOrderTest(AutogenTest, TestBase):
@classmethod