Python Sqlalchemy选择条件
我在一个表上有一个映射器,我想定义一个列_属性,无论实体是否具有某些属性,它都应该选择True或False:Python Sqlalchemy选择条件,python,sqlalchemy,Python,Sqlalchemy,我在一个表上有一个映射器,我想定义一个列_属性,无论实体是否具有某些属性,它都应该选择True或False: mapper( Person, persons_table, properties = { 'administrator': column_property( select( [True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
mapper( Person, persons_table, properties = {
'administrator': column_property(
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
).label( 'administrator' )
)
} )
这是我能做的吗?我对这一部分更感兴趣:
[如果角色\u table.c.是\u admin或角色\u table.c.id==1,则为True],
,它允许我根据条件为列设置一个值。您的选择表达式实际上是一个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\u table.c.is\u admin
将在布尔上下文中计算为True
。我不知道SQLAlchemy将如何解释这一点,但它肯定不会如您所愿工作
您必须重写此表达式,使其对应于普通SQL,而不是使用if。。。否则…
:
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))
然而,在您的情况下,可能有一个更简单的解决方案<代码>人和角色
似乎有一种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)
它必须是bw,因为它是一个列属性。你和炼金术一起工作过吗?