Skip to content

Commit 9234437

Browse files
authored
Filter out empty dialect kwargs (#468)
1 parent 72a20be commit 9234437

3 files changed

Lines changed: 79 additions & 1 deletion

File tree

CHANGES.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
Version history
22
===============
33

4-
**Unreleased**
4+
**4.0.2**
55

66
- Fixed rendering of inherited keyword arguments for dialect-specific types that use
77
``**kwargs`` in their initializers (such as MySQL ``CHAR`` with ``collation``) while
88
preserving existing ``*args`` rendering behavior (PR by @hyoj0942)
99
- Fixed missing metadata argument when rendering plain tables with the SQLModel
1010
- Added support for self-referential tables in the SQLModel generator (PR by @sheinbergon)
11+
- Fixed empty dialect kwargs (e.g. ``postgresql_include=[]``) being included in
12+
rendered indexes, tables, and columns (PR by @sheinbergon)
1113

1214
**4.0.1**
1315

src/sqlacodegen/generators.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ def render_index(self, index: Index) -> str:
427427
kwargs = {
428428
key: repr(value) if isinstance(value, str) else value
429429
for key, value in sorted(index.kwargs.items(), key=lambda item: item[0])
430+
if value not in ([], {})
430431
}
431432
if index.unique:
432433
kwargs["unique"] = True
@@ -778,6 +779,9 @@ def _add_dialect_kwargs_and_info(
778779
except Exception:
779780
continue
780781

782+
if isinstance(value, list | dict) and not value:
783+
continue
784+
781785
# Render values:
782786
# - callable context (values_for_dict=False): produce a string expression.
783787
# primitives use repr(value); custom objects stringify then repr().

tests/test_generator_declarative.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,3 +3161,75 @@ class MyTable(Base):
31613161
tags: Mapped[list[TagEnum]] = mapped_column(ARRAY(Enum(TagEnum, values_callable=lambda cls: [member.value for member in cls], name='tag_enum', schema='custom_schema')), nullable=False)
31623162
""",
31633163
)
3164+
3165+
3166+
def test_index_with_empty_kwargs(generator: CodeGenerator) -> None:
3167+
simple_items = Table(
3168+
"simple_items",
3169+
generator.metadata,
3170+
Column("id", INTEGER, primary_key=True),
3171+
Column("name", VARCHAR),
3172+
)
3173+
simple_items.indexes.add(
3174+
Index(
3175+
"idx_name",
3176+
simple_items.c.name,
3177+
postgresql_using="gist",
3178+
postgresql_include=[],
3179+
)
3180+
)
3181+
3182+
validate_code(
3183+
generator.generate(),
3184+
"""\
3185+
from typing import Optional
3186+
3187+
from sqlalchemy import Index, Integer, String
3188+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
3189+
3190+
class Base(DeclarativeBase):
3191+
pass
3192+
3193+
3194+
class SimpleItems(Base):
3195+
__tablename__ = 'simple_items'
3196+
__table_args__ = (
3197+
Index('idx_name', 'name', postgresql_using='gist'),
3198+
)
3199+
3200+
id: Mapped[int] = mapped_column(Integer, primary_key=True)
3201+
name: Mapped[Optional[str]] = mapped_column(String)
3202+
""",
3203+
)
3204+
3205+
3206+
@pytest.mark.parametrize("generator", [["include_dialect_options"]], indirect=True)
3207+
def test_include_dialect_options_empty_values_skipped(
3208+
generator: CodeGenerator,
3209+
) -> None:
3210+
Table(
3211+
"t_opts3",
3212+
generator.metadata,
3213+
Column("id", INTEGER, primary_key=True),
3214+
mysql_engine="InnoDB",
3215+
mysql_partition_by=[],
3216+
mysql_PROPERTIES={},
3217+
)
3218+
3219+
validate_code(
3220+
generator.generate(),
3221+
"""\
3222+
from sqlalchemy import Integer
3223+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
3224+
3225+
class Base(DeclarativeBase):
3226+
pass
3227+
3228+
3229+
class TOpts3(Base):
3230+
__tablename__ = 't_opts3'
3231+
__table_args__ = {'mysql_engine': 'InnoDB'}
3232+
3233+
id: Mapped[int] = mapped_column(Integer, primary_key=True)
3234+
""",
3235+
)

0 commit comments

Comments
 (0)