Hello everyone:
I success to create ‘user’ table, but failed to add ‘user’ to table.
python version: 3.7.2
SQLAlchemy 1.3.18
- create permission enum
JavaScript
x
6
1
from sqlalchemy.dialects.mysql import SET
2
from enum import Enum
3
class UserPermission(Enum):
4
A = auto()
5
B = auto()
6
- declare ‘user’ table
JavaScript
1
20
20
1
class User(Base):
2
__tablename__ = 'user'
3
_permission = Column('permission', SET(*[name for name,value in UserPermission.__members__.items()]), comment = "user permission", nullable = False, default=set())
4
@hybrid_property
5
def permission(self):
6
'''
7
convert 'str' set to 'Enum' set
8
'''
9
permissionEnumSet = set()
10
for element in self._permission:
11
permissionEnumSet.add(UserPermission[element])
12
return permissionEnumSet
13
14
@permission.setter
15
def permission(self, permissionEnumSet):
16
'''
17
convert 'Enum' set to 'str' set
18
'''
19
self._permission = [permission.name for permission in permissionEnumSet]
20
- add one ‘user’ to table
JavaScript
1
4
1
with Session() as session:
2
user = User(permission = set([UserPermission.A])) # it raise 'NotImplementedError: Operator 'getitem' is not supported on this expression'
3
4
- raise exception
JavaScript
1
25
25
1
File "./src/model.py", line 87, in permission
2
for element in self._permission:
3
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
4
return self.operate(getitem, index)
5
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 219, in operate
6
return op(self.comparator, *other, **kwargs)
7
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
8
return self.operate(getitem, index)
9
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/orm/properties.py", line 367, in operate
10
return op(self.__clause_element__(), *other, **kwargs)
11
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
12
return self.operate(getitem, index)
13
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 759, in operate
14
return op(self.comparator, *other, **kwargs)
15
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/operators.py", line 432, in __getitem__
16
return self.operate(getitem, index)
17
File "<string>", line 1, in <lambda>
18
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/type_api.py", line 67, in operate
19
return o[0](self.expr, op, *(other + o[1:]), **kwargs)
20
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/default_comparator.py", line 237, in _getitem_impl
21
_unsupported_impl(expr, op, other, **kw)
22
File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/sqlalchemy/sql/default_comparator.py", line 242, in _unsupported_impl
23
"Operator '%s' is not supported on " "this expression" % op.__name__
24
NotImplementedError: Operator 'getitem' is not supported on this expression
25
Do you have any good ideas?
Advertisement
Answer
I think it has been instantiated to be an ‘my.SET’ object before assign so that ‘hybird_property’ is called. The object likes ‘None’, it can’t be Iterated. I use below code to check it.
JavaScript
1
11
11
1
from collections.abc import Iterable
2
3
@hybrid_property
4
def permission(self):
5
permissionEnumSet = set()
6
if isinstance(self._permission ,Iterable):
7
for element in self._permission:
8
permissionEnumSet.add(UserPermission[element])
9
return permissionEnumSet
10
11
It works. Do you think it’s okay to do this?