重新排列SQLAlchemy Select对象中的列

麦考林

问题

如何重新排序SQLAlchemy查询对象中的列?

例子

给定一个Select表示以下查询的SQLAlchemy核心对象:

>>> print s
SELECT sum(accounts.amount) AS amount_sum, accounts.name 
FROM accounts GROUP BY accounts.name
 LIMIT :param_1

我想形成一个Select具有完全相同结构对象,但是要按照列的顺序移动

SELECT accounts.name,  sum(accounts.amount) AS amount_sum
FROM accounts GROUP BY accounts.name
 LIMIT :param_1

我尝试过的方法不起作用

我想这样做而又不会显着扩展SQL。我尝试使用withwith_only_columns并将其嵌套在查询中,再次,我想避免

>>> print s.with_only_columns(list(s.columns)[::-1])
SELECT name, amount_sum 
FROM (SELECT sum(accounts.amount) AS amount_sum, accounts.name AS name 
FROM accounts GROUP BY accounts.name
 LIMIT :param_1) GROUP BY accounts.name
 LIMIT :param_2

编辑

为了清楚起见,以上示例仅是示例。我正在寻找一个通用的解决方案,以对任意查询执行此操作。理想情况下,该函数将以Select适当的顺序使用一个对象和一个列名列表。

编辑2

创建代码s同样,我正在寻找解决一般问题的方法,而不仅仅是寻找明确解决以下问题的代码段。

import sqlalchemy

metadata = sqlalchemy.MetaData()

t = sqlalchemy.Table('accounts', metadata,
             sqlalchemy.Column('name', sqlalchemy.String),
             sqlalchemy.Column('amount', sqlalchemy.Integer),
             sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True),
             )

s = (sqlalchemy.select([sqlalchemy.sql.functions.sum(t.c.amount).label('sum'),    
                         t.c.name])
        .group_by(t.c.name)
        .limit(10))

print s


SELECT sum(accounts.amount) AS sum, accounts.name 
FROM accounts GROUP BY accounts.name
 LIMIT :param_1
Zzzeek

您使用了,with_only_columns但是放入其中的列必须来自发送到select()原始列表的列表,而不是select本身的导出列。

您要么必须在外部保留这些列,要么通过select.inner_columns访问器访问它们

下面的会话说明了各种行为。“ .c。” 任何selectable上的collection表示“我们可以从中选择的列”,这就是为什么使用“ someselect.c.somecol”意味着您要像表一样选择FROM语句。

>>> from sqlalchemy import select
>>> from sqlalchemy.sql import table, column

>>> t = table('t', column('a'), column('b'), column('c'))

>>> stmt1 = select([t])
>>> print(stmt1)
SELECT t.a, t.b, t.c FROM t

>>> print(stmt1.with_only_columns([t.c.b, t.c.a]))
SELECT t.b, t.a FROM t

>>> print(stmt1.with_only_columns([stmt1.c.b, stmt1.c.a]))
SELECT b, a FROM (SELECT t.a AS a, t.b AS b, t.c AS c FROM t)

>>> stmt1_cols = dict((c.key, c) for c in stmt1.inner_columns)

>>> stmt1_cols
{'a': <sqlalchemy.sql.elements.ColumnClause at 0x102d0e090; a>, 'c': <sqlalchemy.sql.elements.ColumnClause at 0x102de7c50; c>, 'b': <sqlalchemy.sql.elements.ColumnClause at 0x10047bb50; b>}

>>> dict(t.c)
{'a': <sqlalchemy.sql.elements.ColumnClause at 0x102d0e090; a>, 'c': <sqlalchemy.sql.elements.ColumnClause at 0x102de7c50; c>, 'b': <sqlalchemy.sql.elements.ColumnClause at 0x10047bb50; b>}

>>> assert stmt1_cols == dict(t.c)

>>> print(stmt1.with_only_columns([stmt1_cols['b'], stmt1_cols['a']]))
SELECT t.b, t.a FROM t

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章