SQLAlchemy: как скомпилировать функцию вроде sql.func.std - PullRequest
0 голосов
/ 08 мая 2018

Я хочу внести небольшие изменения в sql.func.std. Я хочу вернуть другое значение, когда стандартный результат равен nan

, используя этот код:

from sqlalchemy.sql.expression import FunctionElement

class std(FunctionElement):
    name = 'std'


@compiles(std)
def compile(element, compiler, **kw):
    elem = compiler.process(element.clauses)
    return "if(isnan(std(%s)), 0, std(%s))" % (elem, elem)


t1 = sql.select([sql.literal("1").label('a')]).alias('t1')

q = sql.select([std(t1.c.a)]).select_from(t1)

результат равеножидается

SELECT if(isnan(std(t1.a)), 0, std(t1.a)) FROM (SELECT '1' AS a) AS t1

при использовании этого запроса

q = sql.select([sql.func.std(t1.c.a)]).select_from(t1)

результат неправильный

SELECT std(t1.a) AS std_1 FROM (SELECT '1' AS a) AS t1

1 Ответ

0 голосов
/ 09 мая 2018

Если вы хотите зарегистрировать общие функции, которые доступны с func, вы должны основывать свою функцию на GenericFunction вместо FunctionElement:

In [6]: from sqlalchemy.sql.functions import GenericFunction
   ...: 
   ...: class std(GenericFunction):
   ...:     name = 'std'
   ...: 

In [8]: q = select([func.std(t1.c.a)]).select_from(t1)

In [9]: print(q)
SELECT if(isnan(std(t1.a)), 0, std(t1.a)) AS std_1 
FROM (SELECT :param_1 AS a) AS t1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...