Пользовательские методы в запросе sqlalchemy - PullRequest
0 голосов
/ 10 июля 2020

Я хочу получить сущности из таблицы ShipProperties и сократить информацию из таблицы ShipPropertiesVisibility, чтобы получить простые сущности can_see и can_edit, указывающие, может ли пользователь видеть или редактировать свойство, соответственно.

В основном что-то вроде этого (где я пытаюсь использовать методы python из того же модуля), за исключением того, что это не работает синтаксически:

def get_properties(ship_internal_id, user_id, company_id):
    ship_properties = db.session.query(ShipProperties, 
            _can_see(ShipPropertiesVisibility.visible 
                    if ShipPropertiesVisibility is not None else None) \
                .label("can_see"), 
            _can_edit(ShipAccess.view_only, ShipPropertiesVisibility.editable 
                    if ShipPropertiesVisibility is not None else None) \
                .label("can_edit"))
            ...
    return ship_properties

def _can_see(visible):
    return visible is None or visible is True

def _can_edit(ship_access_view_only, editable):
    return ship_access_view_only is False \
        and (editable is None or editable is True)

Я также пробовал следующее, так как мои _can_see и _can_edit функции - это просто простые комбинации операторов and и or:

ship_properties = db.session.query(ShipProperties, 
        func.or_(ShipPropertiesVisibility.visible == None,
                ShipPropertiesVisibility.visible == True) \
            .label("can_see"), 
        func.and_(ShipAccess.view_only == False,
                or_(ShipPropertiesVisibility.editable == None,
                    ShipPropertiesVisibility.editable == True)) \
            .label("can_edit"))\
        ...

Но с этим я получаю следующую ошибку:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "or"
LINE 1: ...groups, properties.private AS properties_private, or(ship_pr...

Я также искал гибридные свойства и методы , но я не думаю, что они будут работать, поскольку объект ShipPropertiesVisibility может иметь значение None (что означает, что свойство может быть как видимым, так и редактируемым пользователем), и в этом случае я не верю, что смогу вызвать метод или свойство. Поправьте меня, если я ошибаюсь.

Я близок к решению и просто пропускаю правильный синтаксис, или это серьезная ошибка в мышлении, и мне лучше посмотреть, например, на преобразование результата sqlalchemy в представление модель, или еще что?

1 Ответ

0 голосов
/ 10 июля 2020

Мне удалось найти способ использовать логические sql операторы, применив метод generi c .op().

ship_properties = db.session.query(ShipProperties, Properties, 
        ((ShipPropertiesVisibility.visible == None) \
            .op("OR")(ShipPropertiesVisibility.visible)) \
            .label("can_see"),
        (ShipAccess.view_only == False)
            .op("AND")((ShipPropertiesVisibility.editable == None) \
                .op("OR")(ShipPropertiesVisibility.editable)) \
            .label("can_edit"))\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...