【发布时间】:2017-07-21 12:39:11
【问题描述】:
我已经定义了以下模型和enum:
class StatusEnum(enum.Enum):
NEW = 'NEW'
PROCESSED = 'PROCESSED'
IN_PROGRESS = 'IN_PROGRESS'
class RequestLog(Base):
__tablename__ = 'request_log'
...
status = Column(Enum(StatusEnum))
...
我正在尝试通过以下方式更新记录:
>>> session.query(RequestLog).filter(RequestLog.id.in_([8])).update(
{'status': case(
[(RequestLog.attempt_done_count == RequestLog.attempt_count - 1, StatusEnum.PROCESSED)],
else_=StatusEnum.IN_PROGRESS)},
synchronize_session=False)
在此期间,我收到一个错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'StatusEnum' [SQL: 'UPDATE request_log SET status=CASE WHEN (request_log.attempt_done_count = request_log.attempt_count - %(attempt_count_1)s) THEN %(param_1)s ELSE %(param_2)s END WHERE request_log.id IN (%(id_1)s)'] [parameters: {'param_2': <StatusEnum.IN_PROGRESS: 'IN_PROGRESS'>, 'attempt_count_1': 1, 'param_1': <StatusEnum.PROCESSED: 'PROCESSED'>, 'id_1': 8}]
【问题讨论】:
-
如果直接作为值传递,查询编译器似乎能够转换枚举对象,但如果它们是 SQL 表达式的一部分,则不能。找不到任何关于这是否是设计的参考,也找不到关于该主题的any issues。考虑打开一个?
-
检查您的 SQLA 版本
-
>>> sqlalchemy.__version__'1.1.11'
标签: python enums sqlalchemy python-3.4