From 4ace7dfe978b350653196383298a5dc9ae65b0b3 Mon Sep 17 00:00:00 2001 From: luliangce Date: Mon, 1 Dec 2025 17:28:31 +0800 Subject: [PATCH 1/3] Fix ignoring kwargs and ensure deterministic output (#439) --- CHANGES.rst | 5 ++++ src/sqlacodegen/generators.py | 5 +++- tests/test_generator_declarative.py | 39 +++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2977f2de..98b95e70 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,11 @@ Version history =============== +**UNRELEASED** + +- Fixed ``Index`` kwargs (e.g. ``mysql_length``) being ignored during code generation + (PR by @luliangce) + **3.2.0** - Dropped support for Python 3.9 diff --git a/src/sqlacodegen/generators.py b/src/sqlacodegen/generators.py index eb9175e3..95046143 100644 --- a/src/sqlacodegen/generators.py +++ b/src/sqlacodegen/generators.py @@ -414,7 +414,10 @@ def render_table(self, table: Table) -> str: def render_index(self, index: Index) -> str: extra_args = [repr(col.name) for col in index.columns] - kwargs = {} + kwargs = { + key: repr(value) if isinstance(value, str) else value + for key, value in sorted(index.kwargs.items()) + } if index.unique: kwargs["unique"] = True diff --git a/tests/test_generator_declarative.py b/tests/test_generator_declarative.py index 335be047..bc3ce78f 100644 --- a/tests/test_generator_declarative.py +++ b/tests/test_generator_declarative.py @@ -76,6 +76,41 @@ class SimpleItems(Base): ) +def test_index_with_kwargs(generator: CodeGenerator) -> None: + simple_items = Table( + "simple_items", + generator.metadata, + Column("id", INTEGER, primary_key=True), + Column("name", VARCHAR), + ) + simple_items.indexes.add( + Index("idx_name", simple_items.c.name, postgresql_using="gist", mysql_length=10) + ) + + validate_code( + generator.generate(), + """\ +from typing import Optional + +from sqlalchemy import Index, Integer, String +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + +class Base(DeclarativeBase): + pass + + +class SimpleItems(Base): + __tablename__ = 'simple_items' + __table_args__ = ( + Index('idx_name', 'name', mysql_length=10, postgresql_using='gist'), + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[Optional[str]] = mapped_column(String) + """, + ) + + def test_constraints(generator: CodeGenerator) -> None: Table( "simple_items", @@ -1971,8 +2006,8 @@ class Base(DeclarativeBase): class SpatialTable(Base): __tablename__ = 'spatial_table' __table_args__ = ( - Index('idx_spatial_table_geog', 'geog'), - Index('idx_spatial_table_geom', 'geom') + Index('idx_spatial_table_geog', 'geog', postgresql_using='gist'), + Index('idx_spatial_table_geom', 'geom', postgresql_using='gist') ) id: Mapped[int] = mapped_column(Integer, primary_key=True) From 8dd6c6ee9872d75a033d3f309d39f11932f77830 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:45:56 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3f6dfaa6..30bbad68 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,7 +10,7 @@ Version history ``students_enrollments``). Use ``--options nofknames`` to revert to old behavior. (PR by @sheinbergon) - Fixed ``Index`` kwargs (e.g. ``mysql_length``) being ignored during code generation (PR by @luliangce) - + **4.0.0rc2** - Add ``values_callable`` lambda to generated native enums column definitions. From 87a03be022aa59eebdb2dd8fea0c18a3311b7a92 Mon Sep 17 00:00:00 2001 From: Idan Sheinberg Date: Wed, 4 Feb 2026 02:18:39 +0200 Subject: [PATCH 3/3] Update src/sqlacodegen/generators.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alex Grönholm --- src/sqlacodegen/generators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sqlacodegen/generators.py b/src/sqlacodegen/generators.py index 7f08c7a1..8318d050 100644 --- a/src/sqlacodegen/generators.py +++ b/src/sqlacodegen/generators.py @@ -426,7 +426,7 @@ def render_index(self, index: Index) -> str: extra_args = [repr(col.name) for col in index.columns] kwargs = { key: repr(value) if isinstance(value, str) else value - for key, value in sorted(index.kwargs.items()) + for key, value in sorted(index.kwargs.items(), key=lambda item: item[0]) } if index.unique: kwargs["unique"] = True