Python 结合sqlalchemy使用PostgreSQL聚合顺序
我有一个查询,它使用PostgreSQL的语法在聚合函数中使用ORDER BY,如下所示: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
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])