From: Neil Williams Date: Wed, 22 Nov 2023 18:03:16 +0000 (-0800) Subject: Fix 'alembic check' with multidb env X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc9be8646ef3e822b6cb0ddeecdeb6f2ff1e72eb;p=thirdparty%2Fsqlalchemy%2Falembic.git Fix 'alembic check' with multidb env Fixes: #1234 --- diff --git a/alembic/command.py b/alembic/command.py index dbaa9cf9..c5233e72 100644 --- a/alembic/command.py +++ b/alembic/command.py @@ -290,7 +290,10 @@ def check(config: "Config") -> None: # the revision_context now has MigrationScript structure(s) present. migration_script = revision_context.generated_revisions[-1] - diffs = migration_script.upgrade_ops.as_diffs() + diffs = [] + for upgrade_ops in migration_script.upgrade_ops_list: + diffs.extend(upgrade_ops.as_diffs()) + if diffs: raise util.AutogenerateDiffsDetected( f"New upgrade operations detected: {diffs}" diff --git a/tests/test_command.py b/tests/test_command.py index 382511f9..48e7af3a 100644 --- a/tests/test_command.py +++ b/tests/test_command.py @@ -26,6 +26,7 @@ from alembic.testing import is_false from alembic.testing import is_true from alembic.testing import mock from alembic.testing.env import _get_staging_directory +from alembic.testing.env import _multidb_testing_config from alembic.testing.env import _no_sql_testing_config from alembic.testing.env import _sqlite_file_db from alembic.testing.env import _sqlite_testing_config @@ -665,6 +666,53 @@ finally: ) +class CheckTestMultiDB(CheckTest): + def setUp(self): + self.engine1 = _sqlite_file_db(tempname="eng1.db") + self.engine2 = _sqlite_file_db(tempname="eng2.db") + self.engine3 = _sqlite_file_db(tempname="eng3.db") + + self.env = staging_env(template="multidb") + self.cfg = _multidb_testing_config( + { + "engine1": self.engine1, + "engine2": self.engine2, + "engine3": self.engine3, + } + ) + + def _env_fixture(self): + env_file_fixture( + """ + +import re +from sqlalchemy import MetaData, engine_from_config + +db_names = config.get_main_option("databases", "") +for db_name in re.split(r",\\s*", db_names): + engine = engine_from_config( + config.get_section(db_name), + prefix="sqlalchemy.", + ) + connection = engine.connect() + metadata = MetaData() + context.configure( + connection=connection, + target_metadata=metadata, + ) + + try: + with context.begin_transaction(): + context.run_migrations() + finally: + connection.close() + engine.dispose() + + +""" + ) + + class _StampTest: def _assert_sql(self, emitted_sql, origin, destinations): ins_expr = (