Ваше SELECT-выражение на самом деле является выражением Python:
select([True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
roles_table.c.id == persons_table.c.role_id)
sqlalchemy.select()
увидит это как:
select([True], some_expression_object)
, поскольку объект столбца roles_table.c.is_admin
будет иметь значение True
в логическом контексте. Я не знаю, из головы, как SQLAlchemy будет интерпретировать это, но, безусловно, не будет работать так, как вы хотели.
Вам нужно будет переписать это выражение, чтобы оно соответствовало обычному SQL, используя sqlalchemy.sql.expression.case()
вместо if ... else ...
:
column_property(
select([case([(roles_table.c.is_admin, 1),
(roles_table.c.id == 1, 1)], else_=0)],
roles_table.c.id == persons_table.c.role_id))
В вашем случае, однако, может быть гораздо более простое решение. Person
и Role
, кажется, имеют отношение N:1
(один человек имеет ровно одну роль). Я предполагаю, что есть orm.relationship
Person.role
, чтобы получить роль человека.
Почему бы вам просто не добавить простое свойство Python:
class Person:
# ...
@property
def administrator(self):
return self.role and (self.role.is_admin or self.role.id == 1)