Sqlalchemy выберите условие - PullRequest
       3

Sqlalchemy выберите условие

1 голос
/ 21 октября 2011

У меня есть маппер для таблицы, и я хочу определить свойство column_property, которое должно выбрать 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],
            roles_table.c.id == persons_table.c.role_id
        ).label( 'administrator' )
        )
} )

Это то, что я могу сделать?Меня больше интересует эта часть: [True if roles_table.c.is_admin or roles_table.c.id == 1 else False],, которая позволяет мне установить значение для столбца на основе условия.

1 Ответ

3 голосов
/ 21 октября 2011

Ваше 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...