From: Asib Kamalsada Date: Fri, 25 Aug 2023 13:13:30 +0000 (-0400) Subject: Add `match` keyword argument to rendering of foreign key constraints X-Git-Tag: rel_1_12_0~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c1ad1e0fae1a459758ffa42710dbce21d66ef5a;p=thirdparty%2Fsqlalchemy%2Falembic.git Add `match` keyword argument to rendering of foreign key constraints 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 --- diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 3dfb5e9e..d6cad2c5 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -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) diff --git a/alembic/operations/ops.py b/alembic/operations/ops.py index 4066ac7e..0b66cd70 100644 --- a/alembic/operations/ops.py +++ b/alembic/operations/ops.py @@ -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 index 00000000..0bdca18d --- /dev/null +++ b/docs/build/unreleased/1302.rst @@ -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. + diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index 7a03cc15..cd0b8b4a 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -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): diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index a91d7f94..f0db6699 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -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(