蟒蛇。 SQL炼金术NotImplementedError:操作“的GetItem”不支持这种表达

问题描述 投票:0回答:1

我通过SQL炼金术创建数据库记录。下一步是设法捕捉创建的对象的ID为已创建的对象(assign_resource_to_user)在FK另一个表。这是我的代码:

from dev_tools.models.user import User
from dev_tools.models.resource Resource

resource = Resource(
    code=self.message_body['code'],
    description=self.message_body['description'],
    crew_id=None,
    catalog_resource_type_id=self.message_body['catalog_resource_type_id'],
    catalog_resource_status_id=self.message_body['catalog_resource_status_id'],
    created_at=datetime.utcnow(),
    created_by=None,
    is_available=self.message_body['is_available'],
)
self.db_session.add(resource)
self.db_session.flush()

assign_resource_to_user = self.db_session.query(
    User
).filter(
    User.id == self.user_info.id
).update(
    User.resource_id == resource.id
)
self.db_session.add(assign_resource_to_user)

我有错误:

Traceback (most recent call last):
  File "/home/Документы/project/ResourseManagment/rm-private-application-server/apps/controller/helpers/data_processing/action/custom/resource_from_a_user.py", line 227, in <module>
    resources.create_record_in_db()
  File "/home/Документы/project/ResourseManagment/rm-private-application-server/apps/controller/helpers/data_processing/action/custom/resource_from_a_user.py", line 211, in create_record_in_db
    User.resource_id == resource.id
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/query.py", line 3486, in update
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py", line 1334, in exec_
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py", line 1405, in _do_pre_synchronize
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py", line 1540, in _additional_evaluators
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py", line 1473, in _resolved_values_keys_as_propnames
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py", line 1457, in _resolved_values
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/operators.py", line 411, in __getitem__
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/elements.py", line 694, in operate
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/operators.py", line 411, in __getitem__
  File "<string>", line 1, in <lambda>
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/type_api.py", line 63, in operate
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/default_comparator.py", line 192, in _getitem_impl
  File "/home/Документы/project/venv/lib/python3.7/site-packages/SQLAlchemy-1.2.14-py3.7-linux-x86_64.egg/sqlalchemy/sql/default_comparator.py", line 197, in _unsupported_impl
NotImplementedError: Operator 'getitem' is not supported on this expression

错误字符串:

).update(
    User.resource_id == resource.id
)

也许有人知道如何解决它还是有同样的问题,能不能帮我解决这个问题。谢谢。

python sqlalchemy
1个回答
1
投票

Query.update()预计的属性值来作为第一个位置参数的映射关系,但你通过它的SQL表达式语言对象。需要注意的是Query.update()是批量操作,不返回模型实例或如此,但匹配的行数。因此,而不是做:

self.db_session.query(
    User
).filter(
    User.id == self.user_info.id
).update(
    {User.resource_id: resource.id},
    synchronize_session=False  # Change this according to your needs
)
# No add
© www.soinside.com 2019 - 2024. All rights reserved.