NotImplementedError:此表达式不支持运算符“getitem”

2024-04-24 22:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个SQL查询来为我正在处理的数据库创建一个视图,该查询按预期工作:

CREATE OR REPLACE VIEW public.current_model
AS SELECT pm.model_id,
    mp.name,
    ga.pit,
    pm.description,
    pm.created_datetime,
    pm.folder_full_path,
    pm.status
   FROM prediction_model pm
     JOIN material_property mp ON pm.property_id = mp.auto_id
     JOIN geographic_applicability ga ON ga.model_id = pm.auto_id
  WHERE pm.status::text <> 'INACTIVE'::text AND (pm.created_datetime IN ( SELECT max(pm2.created_datetime) AS max
           FROM prediction_model pm2
             JOIN geographic_applicability ga2 ON ga2.model_id = pm2.auto_id
             JOIN material_property mp2 ON pm2.property_id = mp2.auto_id
          GROUP BY mp2.name, ga2.pit));

现在我需要将此视图添加到数据库的sqlalchemy模式中。我已经成功地实现了其他几个视图,但这一个让我迷路了(请注意,我以前几乎没有sqlalchemy的经验)。这就是我到目前为止的想法:

    @classmethod
    def current_model_view(cls):
        j1 = cls.prediction_model.join(cls.material_property,
                                       cls.prediction_model.c.property_id == cls.material_property.c.auto_id)
        j2 = j1.join(cls.geographic_applicability,
                     cls.prediction_model.c.auto_id == cls.geographic_applicability.c.model_id)

        s1 = cls.prediction_model.join(cls.geographic_applicability,
                                       cls.geographic_applicability.c.model_id == cls.prediction_model.c.auto_id)
        s2 = s1.join(cls.material_property, cls.prediction_model.c.property_id == cls.material_property.c.auto_id)

        max_date = select(max(cls.prediction_model.c.created_datetime)).\
            select_from(s2).group_by(cls.material_property.c.name, cls.geographic_applicability.c.pit)

        view_selectable = select([cls.material_property.c.name,
                                  cls.geographic_applicability.c.pit,
                                  cls.prediction_model.c.description,
                                  cls.prediction_model.c.created_datetime,
                                  cls.prediction_model.c.folder_full_path,
                                  cls.prediction_model.c.status]).\
            select_from(j2).\
            where(and_(not_(cls.prediction_model.c.status == 'INACTIVE'),
                       cls.prediction_model.c.created_datetime.in_(max_date)))
        return view_selectable

但这给了我以下错误:

Traceback (most recent call last):
  File "C:/python/mhi_versionist/mhi_versionist/data_base/tracker_database_schema.py", line 320, in <module>
    create_view('current_model', ModelDB.current_model_view(), ModelDB.model_db_meta)
  File "C:/python/mhi_versionist/mhi_versionist/data_base/tracker_database_schema.py", line 154, in current_model_view
    max_date = select(max(cls.prediction_model.c.created_datetime)).\
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\elements.py", line 762, in operate
    return op(self.comparator, *other, **kwargs)
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "<string>", line 1, in <lambda>
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\type_api.py", line 67, in operate
    return o[0](self.expr, op, *(other + o[1:]), **kwargs)
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\default_comparator.py", line 237, in _getitem_impl
    _unsupported_impl(expr, op, other, **kw)
  File "C:\python\mhi_versionist\venv2\lib\site-packages\sqlalchemy\sql\default_comparator.py", line 241, in _unsupported_impl
    raise NotImplementedError(
NotImplementedError: Operator 'getitem' is not supported on this expression

不知道如何解决这个问题


Tags: inidautomodellinepropertyfilecls
1条回答
网友
1楼 · 发布于 2024-04-24 22:40:08

它看起来如下所示:

max_date = select(max(cls.prediction_model.c.created_datetime)).\

您正在使用Python的max函数,而不是传递sql max函数。你能试着改用sqlalchemy中的max吗?它位于func模块中。所以写下:

max_date = select([func.max(cls.prediction_model.c.created_datetime)]).\

注意,您还需要在select查询中使用列表,因此添加了[ ]

另一方面,如果表定义中正确定义了ForeignKey关系,则不需要明确地告诉sqlalchemy如何进行连接。因此,在这种情况下,您可以通过以下方式逃脱:

    j1 = cls.prediction_model.join(cls.material_property).join(cls.geographic_applicability)
    s1 = cls.prediction_model.join(cls.geographic_applicability).join(cls.material_property)

相关问题 更多 >