【发布时间】:2014-09-19 22:52:33
【问题描述】:
问题
如何重新排序 SQLAlchemy 查询对象中的列?
示例
给定一个代表以下查询的 SQLAlchemy 核心 Select 对象:
>>> 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 的情况下执行此操作。我试过用with_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的代码。同样,我正在寻找一个一般问题的解决方案,而不仅仅是一个明确修复以下顺序的代码 sn-p。
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
【问题讨论】:
-
你能发布创建
Select对象的代码吗? -
@SlavaBacherikov 完成。
标签: python sql sqlalchemy