]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Add `match` keyword argument to rendering of foreign key constraints
authorAsib Kamalsada <asib1999@gmail.com>
Fri, 25 Aug 2023 13:13:30 +0000 (09:13 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 28 Aug 2023 15:53:12 +0000 (11:53 -0400)
Fixed issue where the ``ForeignKeyConstraint.match`` parameter would not be
rendered in autogenerated migrations.  Pull request courtesy Asib
Kamalsada.

Fixes: #1302
Closes: #1303
Pull-request: https://github.com/sqlalchemy/alembic/pull/1303
Pull-request-sha: bd7ae16d77385b1cc00d4339f0debb0c73ce5509

Change-Id: I58ca50b7d04f0ae3dba7bf55ca3242646ae6cb1c

alembic/autogenerate/render.py
alembic/operations/ops.py
docs/build/unreleased/1302.rst [new file with mode: 0644]
tests/test_autogen_render.py
tests/test_postgresql.py

index 3dfb5e9e3b3e4b68a35c74ed74d86dd8b200160d..d6cad2c54fa90c4171b54130bfd1cd76a69ddb4f 100644 (file)
@@ -367,6 +367,7 @@ def _add_fk_constraint(
         "initially",
         "deferrable",
         "use_alter",
+        "match",
     ]
     if not autogen_context._has_batch:
         kwargs.insert(0, "source_schema")
@@ -977,6 +978,8 @@ def _populate_render_fk_opts(
         opts.append(("deferrable", repr(constraint.deferrable)))
     if constraint.use_alter:
         opts.append(("use_alter", repr(constraint.use_alter)))
+    if constraint.match:
+        opts.append(("match", repr(constraint.match)))
 
 
 @_constraint_renderers.dispatch_for(sa_schema.ForeignKeyConstraint)
index 4066ac7ec22524628b99e68b51053b0523501351..0b66cd7032011fb720aba8cf5860ffa7e8064d27 100644 (file)
@@ -545,6 +545,8 @@ class CreateForeignKeyOp(AddConstraintOp):
             kw["deferrable"] = fk_constraint.deferrable
         if fk_constraint.use_alter:
             kw["use_alter"] = fk_constraint.use_alter
+        if fk_constraint.match:
+            kw["match"] = fk_constraint.match
 
         (
             source_schema,
diff --git a/docs/build/unreleased/1302.rst b/docs/build/unreleased/1302.rst
new file mode 100644 (file)
index 0000000..0bdca18
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, autogenerate
+    :tickets: 1302
+
+    Fixed issue where the ``ForeignKeyConstraint.match`` parameter would not be
+    rendered in autogenerated migrations.  Pull request courtesy Asib
+    Kamalsada.
+
index 7a03cc15d9d6a7cf0d80067577c7eec3e13060b9..cd0b8b4abfd4b719bf292c89acac90767d2c54a9 100644 (file)
@@ -480,12 +480,25 @@ class AutogenRenderTest(TestBase):
             "initially='XYZ')",
         )
 
+        fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], match="FULL")
+        op_obj = ops.AddConstraintOp.from_constraint(fk)
+        eq_ignore_whitespace(
+            re.sub(
+                r"u'",
+                "'",
+                autogenerate.render_op_text(self.autogen_context, op_obj),
+            ),
+            "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+            "match='FULL')",
+        )
+
         fk = ForeignKeyConstraint(
             [t1.c.c],
             [t2.c.c_rem],
             initially="XYZ",
             ondelete="CASCADE",
             deferrable=True,
+            match="FULL",
         )
         op_obj = ops.AddConstraintOp.from_constraint(fk)
         eq_ignore_whitespace(
@@ -495,7 +508,8 @@ class AutogenRenderTest(TestBase):
                 autogenerate.render_op_text(self.autogen_context, op_obj),
             ),
             "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
-            "ondelete='CASCADE', initially='XYZ', deferrable=True)",
+            "ondelete='CASCADE', initially='XYZ', deferrable=True, "
+            "match='FULL')",
         )
 
     def test_add_fk_constraint_inline_colkeys(self):
@@ -1374,12 +1388,25 @@ class AutogenRenderTest(TestBase):
             "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], initially='XYZ')",
         )
 
+        fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], match="FULL")
+        eq_ignore_whitespace(
+            re.sub(
+                r"u'",
+                "'",
+                autogenerate.render._render_constraint(
+                    fk, self.autogen_context, m
+                ),
+            ),
+            "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], match='FULL')",
+        )
+
         fk = ForeignKeyConstraint(
             [t1.c.c],
             [t2.c.c_rem],
             initially="XYZ",
             ondelete="CASCADE",
             deferrable=True,
+            match="FULL",
         )
         eq_ignore_whitespace(
             re.sub(
@@ -1390,7 +1417,8 @@ class AutogenRenderTest(TestBase):
                 ),
             ),
             "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], "
-            "ondelete='CASCADE', initially='XYZ', deferrable=True)",
+            "ondelete='CASCADE', initially='XYZ', deferrable=True, "
+            "match='FULL')",
         )
 
     def test_render_fk_constraint_resolve_key(self):
index a91d7f9429b94b2240063aba9f18a9616fe3fb9c..f0db6699057624b3551ae2bccb2c4d6e8066e5cf 100644 (file)
@@ -169,6 +169,11 @@ class PostgresqlOpTest(TestBase):
             "WHERE (x > 5)"
         )
 
+    def test_drop_exclude_or_other_constraint(self):
+        context = op_fixture("postgresql")
+        op.drop_constraint("t_excl_x", "TTable", type_=None)
+        context.assert_('ALTER TABLE "TTable" DROP CONSTRAINT t_excl_x')
+
     def test_create_exclude_constraint_quoted_literal(self):
         context = op_fixture("postgresql")
         op.create_exclude_constraint(