From 4ace7dfe978b350653196383298a5dc9ae65b0b3 Mon Sep 17 00:00:00 2001 From: luliangce Date: Mon, 1 Dec 2025 17:28:31 +0800 Subject: [PATCH] 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 2977f2d..98b95e7 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 eb9175e..9504614 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 335be04..bc3ce78 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)