can't adapt type for enum in case()
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par le reproducer de l’issue avec PostgreSQL et psycopg2, puis examinez comment SQLAlchemy infère les types de la condition CASE et des valeurs de résultat lorsqu’ils sont associés à une colonne Enum. Vérifiez le comportement avec l’expression d’update indiquée et confirmez que des valeurs Enum équivalentes s’exécutent sans casts explicites.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Python
- Étoiles
- 12.3k
- Forks
- 1.8k
- Merge moyen
- 2 j 10 h
- PR mergées (30 j)
- 9
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de sqlalchemy/sqlalchemy
-
requires triage
Difficulté 1/5 1-3 heures Accessibilité débutants 85/100
sqlalchemy/sqlalchemy#13784 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug engine
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
sqlalchemy/sqlalchemy#13770 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
declared_attr.cascading fails to typecheck under mypy / pyright on documented usagePeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertebug orm typing
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
sqlalchemy/sqlalchemy#13731 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
PostgreSQL multihost URL with bracketed IPv6 hosts raises ValueError: too many values to unpackPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertebug engine postgresql
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
sqlalchemy/sqlalchemy#13637 · 6 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
asyncpg dialect raises DBAPIError, not DataError, for SQLSTATE class 22 errorsPeut-être pris @HardMax71 l’a pris il y a 20 jours. Ouvertebug code review in progress dialects
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
sqlalchemy/sqlalchemy#13636 · 19 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de sqlalchemy/sqlalchemy
Issues similaires
-
Unknown stop ID in slow zone data crashes post formatting and skips the rest of that day's postsOuvertebackend bug tm-new-volunteer
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
transitmatters/mbta-slow-zone-bot#81 · 1 commentaire ·
-
area:schema documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
risk:high type:ci
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
spacetelescope/rdmt-spire#49 ·
Les mainteneurs répondent en général sous 1 jour