如何重新排序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
适当的顺序使用一个对象和一个列名列表。
创建代码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
您使用了,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] 删除。
我来说两句