【问题标题】:SQLAlchemy getting label names out from columnsSQLAlchemy 从列中获取标签名称
【发布时间】:2015-03-31 09:54:12
【问题描述】:

我想使用 SQLAlchemy 表中的相同标签来重新聚合一些数据(例如,我想遍历 mytable.c 以准确获取列名)。

我有一些支出数据,如下所示:

| name | region | date | spending |
| John |    A   | .... |   123    |
| Jack |    A   | .... |    20    |
| Jill |    B   | .... |   240    |

然后我将它传递给我们现有的函数,该函数汇总了超过 2 个时期的支出(使用案例语句)并按地区分组:

grouped table:
| Region | Total (this period) | Total (last period)  |
|    A   |             3048    |             1034     |
|    B   |             2058    |              900     |

该函数返回一个 SQLAlchemy 查询对象,然后我可以使用 subquery() 重新查询例如:

subquery = get_aggregated_data(original_table)
region_A_results = session.query(subquery).filter(subquery.c.region = 'A')

然后我想重新聚合这个子查询(对可以求和的每一列求和,用字符串 'other' 替换 region 列。

问题是,如果我遍历 subquery.c,我得到的标签看起来像:

anon_1.region
anon_1.sum_this_period
anon_1.sum_last_period

有没有办法从一组列对象中获取文本标签,而不需要 anon_1. 前缀?特别是因为我觉得前缀可能会根据 SQLAlchemy 决定生成查询的方式而改变。

【问题讨论】:

    标签: sql postgresql sqlalchemy


    【解决方案1】:

    拆分名称字符串并取第二部分,如果您想为名称不以表名作为前缀的机会做准备,请将代码放在try - except块中:

    for col in subquery.c:
        try:
            print(col.name.split('.')[1])
        except IndexError:
            print(col.name)
    

    此外,结果代理 (region_A_results) 有一个方法 keys,它返回一个列名列表。同样,如果您不需要表名,您可以轻松摆脱它们。

    【讨论】:

    • 这正是我想要的。假设 split('.') 将处理 table.column 拆分是否安全?到目前为止,我已经看到 SQLAlchemy 自动生成的所有表/列标签都是蛇形大小写,但我认为这是由于句点字符在 SQL 表达式中是模式/表/列分隔符?
    • 是的,split('.') 应该是很好的拆分 table.column 标签约定,它不会关心字符串是蛇形还是其他。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2019-02-14
    • 2021-08-24
    • 2020-11-19
    相关资源
    最近更新 更多