简体   繁体   中英

Python. SQL Alchemy NotImplementedError: Operator 'getitem' is not supported on this expression

I create record in DB through sql alchemy. The next step is trying to capture the id of the created object into another table that has fk on the created object (assign_resource_to_user) . This is my code:

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)

I have error:

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

Error in this string:

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

Maybe someone know how fix it or have same problem and can help me solve it. Thanks.

Query.update() expects a mapping of attributes to values as the first positional argument, but you've passed it an SQL expression language object. Note that Query.update() is a bulk operation and does not return a model instance or such, but the number of matched rows. So instead do:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM