Python。SQL Alchemy NotImplementedError:此表达式不支持运算符“getitem”

MrO*_*Sir 6 python sqlalchemy

我通过 sql alchemy 在数据库中创建记录。下一步是尝试将创建的对象的 id 捕获到另一个表中,该表在创建的对象上具有 fk (assign_resource_to_user) 。这是我的代码:

\n\n
from dev_tools.models.user import User\nfrom dev_tools.models.resource Resource\n\nresource = Resource(\n    code=self.message_body[\'code\'],\n    description=self.message_body[\'description\'],\n    crew_id=None,\n    catalog_resource_type_id=self.message_body[\'catalog_resource_type_id\'],\n    catalog_resource_status_id=self.message_body[\'catalog_resource_status_id\'],\n    created_at=datetime.utcnow(),\n    created_by=None,\n    is_available=self.message_body[\'is_available\'],\n)\nself.db_session.add(resource)\nself.db_session.flush()\n\nassign_resource_to_user = self.db_session.query(\n    User\n).filter(\n    User.id == self.user_info.id\n).update(\n    User.resource_id == resource.id\n)\nself.db_session.add(assign_resource_to_user)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有错误:

\n\n
Traceback (most recent call last):\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/project/ResourseManagment/rm-private-application-server/apps/controller/helpers/data_processing/action/custom/resource_from_a_user.py", line 227, in <module>\n    resources.create_record_in_db()\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n    User.resource_id == resource.id\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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_\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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__\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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__\n  File "<string>", line 1, in <lambda>\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\n  File "/home/\xd0\x94\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8b/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\nNotImplementedError: Operator \'getitem\' is not supported on this expression\n
Run Code Online (Sandbox Code Playgroud)\n\n

该字符串错误:

\n\n
).update(\n    User.resource_id == resource.id\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

也许有人知道如何解决它或有同样的问题,可以帮助我解决它。谢谢。

\n

Ilj*_*ilä 5

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
Run Code Online (Sandbox Code Playgroud)