can't adapt type for enum in case()
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginnen Sie mit dem Reproducer im Issue unter Verwendung von PostgreSQL und psycopg2. Untersuchen Sie anschließend, wie SQLAlchemy die Typen für die CASE-Bedingung und die Ergebniswerte ableitet, wenn sie einer Enum-Spalte zugeordnet werden. Überprüfen Sie das Verhalten mit dem gezeigten Update-Ausdruck und bestätigen Sie, dass äquivalente Enum-Werte ohne explizite Casts ausgeführt werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
I can't use an enum type as part of a case() without casting.
Looks very similar to https://github.com/sqlalchemy/sqlalchemy/issues/6515
Optional link from https://docs.sqlalchemy.org which documents the behavior that is expected
No response
SQLAlchemy Version in Use
2.0.36
DBAPI (i.e. the database driver)
psycopg2
Database Vendor and Major Version
PostgreSQL 12
Python Version
3.11
Operating system
macOS
To Reproduce
import enum
from sqlalchemy import case, create_engine, update, types as sqltypes
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, sessionmaker
Session = sessionmaker()
class Base(DeclarativeBase):
pass
class State(enum.Enum):
PENDING = enum.auto()
RUNNING = enum.auto()
CANCELLING = enum.auto()
CANCELLED = enum.auto()
StateType = sqltypes.Enum(State)
class Job(Base):
__tablename__ = "jobs"
id: Mapped[int] = mapped_column(primary_key=True)
state: Mapped[State] = mapped_column(StateType, server_default=State.PENDING.name)
def main(engine):
with engine.connect() as conn:
conn.execute(
update(Job).values(
state=case(
(
Job.state == State.PENDING,
State.CANCELLED,
),
else_=State.CANCELLING,
)
)
)
if __name__ == "__main__":
engine = create_engine("postgresql:///issue12097", echo=True)
Session.configure(bind=engine)
Base.metadata.create_all(engine)
try:
main(engine)
finally:
Base.metadata.drop_all(engine)
Error
Traceback (most recent call last):
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
cursor.execute(statement, parameters)
psycopg2.ProgrammingError: can't adapt type 'State'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "issue12096.py", line 50, in <module>
main(engine)
File "issue12096.py", line 32, in main
conn.execute(
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1418, in execute
return meth(
^^^^^
File ".venv/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 515, in _execute_on_connection
return connection._execute_clauseelement(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1640, in _execute_clauseelement
ret = self._execute_context(
^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
return self._exec_single_context(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
self._handle_dbapi_exception(
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2355, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
File ".venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'State'
[SQL: UPDATE jobs SET state=CASE WHEN (jobs.state = %(state_1)s) THEN %(param_1)s ELSE %(param_2)s END]
[parameters: {'state_1': 'PENDING', 'param_1': <State.CANCELLED: 4>, 'param_2': <State.CANCELLING: 3>}]
(Background on this error at: https://sqlalche.me/e/20/f405)
It works if I add casts:
update(Job).values(
state=case(
(
Job.state == cast(State.PENDING, StateType),
cast(State.CANCELLED, StateType),
),
else_=cast(State.CANCELLING, StateType),
)
)
Additional context
mcve requires you to run createdb issue12097 first.
- Vorherrschende Sprache
- Python
- Sterne
- 12.3k
- Forks
- 1.8k
- Ø Merge
- 2 T. 10 Std.
- Gemergte PRs (30 T.)
- 9
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus sqlalchemy/sqlalchemy
-
requires triage
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 85/100
sqlalchemy/sqlalchemy#13784 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug engine
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
sqlalchemy/sqlalchemy#13770 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
declared_attr.cascading fails to typecheck under mypy / pyright on documented usageEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offenbug orm typing
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
sqlalchemy/sqlalchemy#13731 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
PostgreSQL multihost URL with bracketed IPv6 hosts raises ValueError: too many values to unpackEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offenbug engine postgresql
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
sqlalchemy/sqlalchemy#13637 · 6 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
asyncpg dialect raises DBAPIError, not DataError, for SQLSTATE class 22 errorsEvtl. vergeben @HardMax71 hat das vor 20 Tagen übernommen. Offenbug code review in progress dialects
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
sqlalchemy/sqlalchemy#13636 · 19 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in sqlalchemy/sqlalchemy
Ähnliche Issues
-
Unknown stop ID in slow zone data crashes post formatting and skips the rest of that day's postsOffenbackend bug tm-new-volunteer
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
transitmatters/mbta-slow-zone-bot#81 · 1 Kommentar ·
-
area:schema documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
risk:high type:ci
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
spacetelescope/rdmt-spire#49 ·
Maintainer antworten meist innerhalb von 1 Tag