[英]Python. SQL Alchemy NotImplementedError: Operator 'getitem' is not supported on this expression
[英]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.