]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Fix 'alembic check' with multidb env
authorNeil Williams <neil@spladug.net>
Wed, 22 Nov 2023 18:51:48 +0000 (13:51 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 22 Nov 2023 19:38:51 +0000 (14:38 -0500)
Fixed issue where the ``alembic check`` command did not function correctly
with upgrade structures that have multiple, top-level elements, as are
generated from the "multi-env" environment template.  Pull request courtesy
Neil Williams.

Fixes: #1234
Closes: #1365
Pull-request: https://github.com/sqlalchemy/alembic/pull/1365
Pull-request-sha: fc9be8646ef3e822b6cb0ddeecdeb6f2ff1e72eb

Change-Id: I38a1c19000c322e368701fb481899534aecf2cee

alembic/command.py
docs/build/unreleased/1234.rst [new file with mode: 0644]
tests/test_command.py

index dbaa9cf965c7516e3b4c38e69be992e5a649e25d..c5233e72efd27b12f20934d82f649f24923c1fe3 100644 (file)
@@ -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/docs/build/unreleased/1234.rst b/docs/build/unreleased/1234.rst
new file mode 100644 (file)
index 0000000..4df0078
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, commands
+    :tickets: 1234
+
+    Fixed issue where the ``alembic check`` command did not function correctly
+    with upgrade structures that have multiple, top-level elements, as are
+    generated from the "multi-env" environment template.  Pull request courtesy
+    Neil Williams.
index 382511f9b7b8872bceaa0ea24c05f7da100de3c2..48e7af3af8011cec1a15082d2a9e9dc0423f9369 100644 (file)
@@ -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 = (