]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Add additional test
authorJustin Malin <justin@joincandidhealth.com>
Mon, 9 Jun 2025 20:01:33 +0000 (20:01 +0000)
committerJustin Malin <justin@joincandidhealth.com>
Mon, 9 Jun 2025 20:01:33 +0000 (20:01 +0000)
alembic/autogenerate/render.py
tests/test_autogen_render.py

index d5ca2f4faca03090f20739b4ae5507b673077a7a..04e20facf3976fadcac25f323699d0acb5af31a1 100644 (file)
@@ -390,6 +390,7 @@ def _add_unique_constraint(
 def _add_fk_constraint(
     autogen_context: AutogenContext, op: ops.CreateForeignKeyOp
 ) -> str:
+    constraint = op.to_constraint()
     args = [repr(_render_gen_name(autogen_context, op.constraint_name))]
     if not autogen_context._has_batch:
         args.append(repr(_ident(op.source_table)))
@@ -419,10 +420,7 @@ def _add_fk_constraint(
             if value is not None:
                 args.append("%s=%r" % (k, value))
 
-
-    # op.to_constraint() may fail with `multiple values for argument 'name'`.
-    dialect_kwarg_view = getattr(op.kw, "dialect_kwargs", {})
-    dialect_kwargs = _render_dialect_kwargs_items(autogen_context, dialect_kwarg_view)
+    dialect_kwargs = _render_dialect_kwargs_items(autogen_context, constraint.dialect_kwargs)
 
     return "%(prefix)screate_foreign_key(%(args)s%(dialect_kwargs)s)" % {
         "prefix": _alembic_autogenerate_prefix(autogen_context),
index 55e802307951d08868577fababbcf93f04b595ed..38fe57981cf63a909ccaa68233fe43eb76b6477a 100644 (file)
@@ -41,7 +41,7 @@ from alembic import op  # noqa
 from alembic import testing
 from alembic.autogenerate import api
 from alembic.migration import MigrationContext
-from alembic.operations import ops
+from alembic.operations import Operations, ops
 from alembic.testing import assert_raises
 from alembic.testing import assertions
 from alembic.testing import config
@@ -314,6 +314,18 @@ class AutogenRenderTest(TestBase):
             "somedialect_foobar='option')",
         )
 
+    def test_add_fk_constraint__dialect_kwargs(self):
+        t1 = self.table()
+        t2 = self.table()
+        item = ForeignKeyConstraint([t1.c.id], [t2.c.id], name="fk", postgresql_not_valid=True)
+        fk_obj = ops.CreateForeignKeyOp.from_constraint(item)
+
+        eq_ignore_whitespace(
+            re.sub( r"u'", "'", autogenerate.render_op_text(self.autogen_context, fk_obj)),
+            "op.create_foreign_key('fk', 'test', 'test', ['id'], ['id'], postgresql_not_valid=True)",
+        )
+
+
     def test_drop_index_batch(self):
         """
         autogenerate.render._drop_index
@@ -2466,6 +2478,52 @@ class AutogenRenderTest(TestBase):
             "server_default=None)",
         )
 
+# class PostgresDialectKwargsTest(TestBase):
+#     def setUp(self):
+#         ctx_opts = {
+#             "sqlalchemy_module_prefix": "sa.",
+#             "alembic_module_prefix": "op.",
+#             "target_metadata": MetaData(),
+#         }
+#         context = MigrationContext.configure(
+#             dialect_name="postgresql", opts=ctx_opts
+#         )
+#         self.autogen_context = api.AutogenContext(context)
+#
+#     def test_add_fk_constraint__dialect_kwargs(self):
+#         t1 = Table(
+#             "t1",
+#             MetaData(),
+#             Column("c1", Integer, primary_key=True),
+#         )
+#         t2 = Table(
+#             "t2",
+#             MetaData(),
+#             Column("c2", Integer, primary_key=True),
+#         )
+#         item = ForeignKeyConstraint([t1.c.c1], [t2.c.c2], name="fk", postgresql_not_valid=True)
+#
+#         # fk_obj = ops.CreateForeignKeyOp(
+#         #     constraint_name="fk",
+#         #     source_table="t1",
+#         #     referent_table="t2",
+#         #     local_cols=["c1"],
+#         #     remote_cols=["c2"],
+#         #     **item.__dict__,
+#         #     postgresql_not_valid=True
+#         # )
+#         fk_obj = ops.CreateForeignKeyOp.from_constraint(item)
+#         print(fk_obj.kw)
+#         fk_obj.kw["postgresql_not_valid"] = True
+#
+#         print(fk_obj.kw)
+#         print(fk_obj.kw.get("dialect_kwargs", {}))
+#
+#         eq_ignore_whitespace(
+#             re.sub( r"u'", "'", autogenerate.render_op_text(self.autogen_context, fk_obj)),
+#             "op.create_foreign_key('fk', 't1', 't2', ['c1'], ['c2'], postgresql_not_valid=True)",
+#         )
+
 
 class RenderNamingConventionTest(TestBase):
     def setUp(self):