繁体   English   中英

Sqlalchemy 引发 'NotImplementedError: Operator 'getitem' is not supported on this expression' 在 mysql.SET 中使用 'hybrid_property' 时

[英]Sqlalchemy raise 'NotImplementedError: Operator 'getitem' is not supported on this expression' When use 'hybrid_property' in mysql.SET

大家好

我成功创建了“用户”表,但未能将“用户”添加到表中。

蟒蛇版本:3.7.2

SQLAlchemy 1.3.18

  • 创建权限枚举
from sqlalchemy.dialects.mysql import SET
from enum import Enum
class UserPermission(Enum):
    A = auto()
    B = auto()
  • 声明“用户”表
class User(Base):
    __tablename__ = 'user'
    _permission = Column('permission', SET(*[name for name,value in UserPermission.__members__.items()]), comment = "user permission", nullable = False, default=set())
    @hybrid_property
    def permission(self):
        '''
        convert 'str' set to 'Enum' set
        '''
        permissionEnumSet = set()
        for element in self._permission:
            permissionEnumSet.add(UserPermission[element])
        return permissionEnumSet

    @permission.setter
    def permission(self, permissionEnumSet):
        '''
        convert 'Enum' set to 'str' set
        ''' 
        self._permission = [permission.name for permission in permissionEnumSet]
  • 在表中添加一个“用户”
with Session() as session:
    user = User(permission = set([UserPermission.A])) # it raise 'NotImplementedError: Operator 'getitem' is not supported on this expression'

  • 引发异常
File "./src/model.py", line 87, in permission
    for element in self._permission:
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 219, in operate
    return op(self.comparator, *other, **kwargs)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/orm/properties.py", line 367, in operate
    return op(self.__clause_element__(), *other, **kwargs)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 759, in operate
    return op(self.comparator, *other, **kwargs)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
    return self.operate(getitem, index)
  File "<string>", line 1, in <lambda>
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/type_api.py", line 67, in operate
    return o[0](self.expr, op, *(other + o[1:]), **kwargs)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/default_comparator.py", line 237, in _getitem_impl
    _unsupported_impl(expr, op, other, **kw)
  File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/default_comparator.py", line 242, in _unsupported_impl
    "Operator '%s' is not supported on " "this expression" % op.__name__
NotImplementedError: Operator 'getitem' is not supported on this expression

你有什么好主意吗?

我认为在分配之前它已被实例化为“my.SET”对象,以便调用“hybird_property”。 对象喜欢“无”,它不能被迭代。 我使用下面的代码来检查它。

    from collections.abc import Iterable

    @hybrid_property
    def permission(self):
        permissionEnumSet = set()
        if isinstance(self._permission ,Iterable):
            for element in self._permission:
                permissionEnumSet.add(UserPermission[element])
        return permissionEnumSet

有用。 你认为这样做好吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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