SQLAlchemy case语句执行报错:AttributeError: Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'description'
SQLAlchemy case语句执行报错:AttributeError: Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'description'
兄弟,我一眼就发现问题所在了!你调用SQLAlchemy case()函数的方式不对,才导致了这个奇怪的错误。
错误原因
SQLAlchemy的case函数要求第一个参数是一个包含(条件表达式, 对应结果)元组的列表/可迭代对象,但你现在是把每个(条件,结果)元组作为独立的位置参数直接传给case了。这种写法会让SQLAlchemy内部把第一个元组当成整个whens参数来解析,而元组里的条件表达式(比如orders.c.item_delivered.is_(True))是BinaryExpression类型,不是字典结构,所以触发了这个AttributeError。
修复方案
把所有的(条件,结果)对打包成一个列表,作为case的第一个参数传入(或者用whens=关键字参数显式指定)。修正后的代码如下:
status = case( [ ( orders.c.item_delivered.is_(True), OrderStatus.DELIVERED.value, ), ( orders.c.order_processing_status == OrderStatus.COMPLETED.value, OrderStatus.COMPLETED.value, ), ( and_( orders.c.order_processing_status == OrderStatus.EXCEPTION.value, orders.c.order_processing_reason == OrderReason.OUT_OF_STOCK.value, ), OrderStatus.OUT_OF_STOCK.value, ), ( and_( orders.c.invoice_id.is_(None), orders.c.invoice_status == InvoiceStatus.FAILED.value, ), OrderStatus.EXCEPTION.value, ), ( and_( orders.c.invoice_id.is_(None), orders.c.invoice_status.in_( [ InvoiceStatus.PROCESSED.value, InvoiceStatus.COMPLETE_WITH_ERRORS.value, ] ), ), OrderStatus.COMPLETED.value, ), ], else_=OrderStatus.IN_PROGRESS.value, )
额外提醒
你提到本地环境没报错,有可能是本地SQLAlchemy版本和生产环境存在细微差异(虽然你说都是1.4.46,但可以再确认下依赖锁文件)。不过按照SQLAlchemy官方文档的标准写法,上面的修复版本是最稳妥的,能确保在1.4.x版本的SQLAlchemy中正常运行。
备注:内容来源于stack exchange,提问作者momo
相关产品推荐
相关产品推荐

