Skip to content

Commit edb17ec

Browse files
authored
Add value mapping for native enums (#452)
* Add value mapping for native enums * Test fixes * Document in CHANGES.rst * Support synthetic enums as well
1 parent f4619eb commit edb17ec

5 files changed

Lines changed: 21 additions & 17 deletions

File tree

CHANGES.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Version history
22
===============
33

4+
**4.0.0rc2**
5+
6+
- Add ``values_callable`` lambda to generated native enums column definitions.
7+
This allows for proper enum value insertion when working with ORM models (PR by @sheinbergon)
8+
49
**4.0.0rc1**
510

611
- **BACKWARD INCOMPATIBLE** ``TablesGenerator.render_column_type()`` was changed to

src/sqlacodegen/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,7 @@ def render_column_type(self, column: Column[Any]) -> str:
547547
):
548548
# Import SQLAlchemy Enum (will be handled in collect_imports)
549549
self.add_import(Enum)
550-
# Return the Python enum class as the type parameter
551-
return f"Enum({enum_class_name})"
550+
return f"Enum({enum_class_name}, values_callable=lambda cls: [member.value for member in cls])"
552551

553552
args = []
554553
kwargs: dict[str, Any] = {}

tests/test_generator_declarative.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2063,14 +2063,14 @@ class Accounts(Base):
20632063
__tablename__ = 'accounts'
20642064
20652065
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2066-
status: Mapped[StatusEnum] = mapped_column(Enum(StatusEnum), nullable=False)
2066+
status: Mapped[StatusEnum] = mapped_column(Enum(StatusEnum, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
20672067
20682068
20692069
class Users(Base):
20702070
__tablename__ = 'users'
20712071
20722072
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2073-
status: Mapped[StatusEnum] = mapped_column(Enum(StatusEnum), nullable=False)
2073+
status: Mapped[StatusEnum] = mapped_column(Enum(StatusEnum, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
20742074
""",
20752075
)
20762076

@@ -2109,7 +2109,7 @@ class Users(Base):
21092109
__tablename__ = 'users'
21102110
21112111
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2112-
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus), nullable=False)
2112+
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
21132113
""",
21142114
)
21152115

@@ -2160,14 +2160,14 @@ class A(Base):
21602160
__tablename__ = 'a'
21612161
21622162
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2163-
b_c: Mapped[ABC] = mapped_column(Enum(ABC), nullable=False)
2163+
b_c: Mapped[ABC] = mapped_column(Enum(ABC, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
21642164
21652165
21662166
class AB(Base):
21672167
__tablename__ = 'a_b'
21682168
21692169
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2170-
c: Mapped[ABC] = mapped_column(Enum(ABC), nullable=False)
2170+
c: Mapped[ABC] = mapped_column(Enum(ABC, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
21712171
""",
21722172
)
21732173

@@ -2223,14 +2223,14 @@ class A(Base):
22232223
__tablename__ = 'a'
22242224
22252225
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2226-
b_c: Mapped[ABC1] = mapped_column(Enum(ABC1), nullable=False)
2226+
b_c: Mapped[ABC1] = mapped_column(Enum(ABC1, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
22272227
22282228
22292229
class AB(Base):
22302230
__tablename__ = 'a_b'
22312231
22322232
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2233-
c: Mapped[ABC] = mapped_column(Enum(ABC), nullable=False)
2233+
c: Mapped[ABC] = mapped_column(Enum(ABC, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
22342234
""",
22352235
)
22362236

@@ -2269,7 +2269,7 @@ class Users(Base):
22692269
)
22702270
22712271
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2272-
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus), nullable=False)
2272+
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
22732273
""",
22742274
)
22752275

@@ -2357,7 +2357,7 @@ class Accounts(Base):
23572357
)
23582358
23592359
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2360-
status: Mapped[AccountsStatus] = mapped_column(Enum(AccountsStatus), nullable=False)
2360+
status: Mapped[AccountsStatus] = mapped_column(Enum(AccountsStatus, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
23612361
23622362
23632363
class Users(Base):
@@ -2367,6 +2367,6 @@ class Users(Base):
23672367
)
23682368
23692369
id: Mapped[int] = mapped_column(Integer, primary_key=True)
2370-
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus), nullable=False)
2370+
status: Mapped[UsersStatus] = mapped_column(Enum(UsersStatus, values_callable=lambda cls: [member.value for member in cls]), nullable=False)
23712371
""",
23722372
)

tests/test_generator_sqlmodel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,6 @@ class Accounts(SQLModel, table=True):
266266
)
267267
268268
id: int = Field(sa_column=Column('id', Integer, primary_key=True))
269-
status: AccountsStatus = Field(sa_column=Column('status', Enum(AccountsStatus), nullable=False))
269+
status: AccountsStatus = Field(sa_column=Column('status', Enum(AccountsStatus, values_callable=lambda cls: [member.value for member in cls]), nullable=False))
270270
""",
271271
)

tests/test_generator_tables.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class Blah(str, enum.Enum):
7575
7676
t_simple_items = Table(
7777
'simple_items', metadata,
78-
Column('enum', Enum(Blah)),
78+
Column('enum', Enum(Blah, values_callable=lambda cls: [member.value for member in cls])),
7979
Column('bool', Boolean),
8080
Column('vector', VECTOR(3)),
8181
Column('number', Numeric(10, asdecimal=False)),
@@ -266,7 +266,7 @@ class SimpleItemsStatus(str, enum.Enum):
266266
t_simple_items = Table(
267267
'simple_items', metadata,
268268
Column('id', Integer, primary_key=True),
269-
Column('status', Enum(SimpleItemsStatus)),
269+
Column('status', Enum(SimpleItemsStatus, values_callable=lambda cls: [member.value for member in cls])),
270270
CheckConstraint("simple_items.status IN ('active', 'inactive', 'pending')")
271271
)
272272
""",
@@ -308,13 +308,13 @@ class StatusEnum(str, enum.Enum):
308308
t_accounts = Table(
309309
'accounts', metadata,
310310
Column('id', Integer, primary_key=True),
311-
Column('status', Enum(StatusEnum))
311+
Column('status', Enum(StatusEnum, values_callable=lambda cls: [member.value for member in cls]))
312312
)
313313
314314
t_users = Table(
315315
'users', metadata,
316316
Column('id', Integer, primary_key=True),
317-
Column('status', Enum(StatusEnum))
317+
Column('status', Enum(StatusEnum, values_callable=lambda cls: [member.value for member in cls]))
318318
)
319319
""",
320320
)

0 commit comments

Comments
 (0)