Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结合sqlalchemy使用PostgreSQL聚合顺序_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python 结合sqlalchemy使用PostgreSQL聚合顺序

Python 结合sqlalchemy使用PostgreSQL聚合顺序,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个查询,它使用PostgreSQL的语法在聚合函数中使用ORDER BY,如下所示: SELECT some_agg_func(a ORDER BY b DESC) FROM table; 有人知道如何使用sqlalchemy表达式语言实现这一点吗?您需要使用sqlalchemy的扩展来实现这一点。以下是Postgresstring\u agg函数的示例: from sqlalchemy.sql.expression import ColumnElement, _literal_as_c

我有一个查询,它使用PostgreSQL的语法在聚合函数中使用ORDER BY,如下所示:

SELECT some_agg_func(a ORDER BY b DESC) FROM table;

有人知道如何使用sqlalchemy表达式语言实现这一点吗?

您需要使用sqlalchemy的扩展来实现这一点。以下是Postgres
string\u agg
函数的示例:

from sqlalchemy.sql.expression import ColumnElement, _literal_as_column
from sqlalchemy.dialects import postgresql
from sqlalchemy.ext.compiler import compiles

class string_agg(ColumnElement):
    def __init__(self, expr, separator, order_by=None):
        self.type = Text()
        self.expr = _literal_as_column(expr)
        self.separator = literal(separator)
        self.order_by = _literal_as_column(order_by)

    @property
    def _from_objects(self):
        return self.expr._from_objects

@compiles(string_agg, 'postgresql')
def compile_string_agg(element, compiler, **kwargs):
    head = 'string_agg(%s, %s' % (
        compiler.process(element.expr),
        compiler.process(element.separator)
    )
    if element.order_by is not None:
        tail = ' ORDER BY %s)' % compiler.process(element.order_by)
    else:
        tail = ')'
    return head + tail

query = session.query(string_agg(Foo.bar, ', ', order_by=Foo.bar.desc()))
# Print compiled SQL query.
print query.statement.compile(dialect=postgresql.dialect())
# Run the query and print result.
print query.scalar()

我认为SqlAlchemy 1.1现在已经对
string\u agg
提供了本机支持:(在页面中搜索“func.string\u agg”)


sqlalchemy 0.8似乎没有
\u literal\u as\u column
,我通过使用
\u cause\u element\u\u
解决了这个问题,这就是
\u literal\u as\u column
的作用。否则一切都很好。是的,我在0.7.9上测试了这个。我认为
\u literal\u as\u column
在0.8中被重命名为
\u literal\u as\u binds
,或者可能不是,因为我看到
\u literal\u as\u binds
在0.7代码库中也存在。您可以编辑以添加链接和使用它的具体示例吗?那么我可以接受这是正确的答案。谢谢
from sqlalchemy.dialects.postgresql import aggregate_order_by

expr = func.array_agg(aggregate_order_by(table.c.a, table.c.b.desc()))
stmt = select([expr])