簡體   English   中英

NotImplementedError:此表達式不支持運算符“getitem”

[英]NotImplementedError: Operator 'getitem' is not supported on this expression

我寫了一個 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

不知道如何解決這個問題。

它看起來像以下行:

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

您正在使用 Python 的max function,而不是通過 sql max function。 您可以嘗試使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM