当我使用函数而不是带有键 func_name_1 的嵌套对象时,SQLAlchemy 如何 select 平面数组

SQLAlchemy how to select flat array when I use function instead of nested object with key func_name_1

我有一些 category table,我正在尝试获得类似这样的平面阵列

select([psql.array_agg(category.c.name)])

预期结果:

["foo", "bar", "etc"]

实际结果:

[
  {
    "array_agg_1": ["foo", "bar", "etc"]
  }
]

我尝试过很多不同的选择。但它们更像是解决方法。最有趣的是,在 postgres 控制台中一切看起来都很好。

select array_agg(name) from category
{foo,bar,etc}

为什么会发生这种情况,如何在不进行额外的子选择、按键获取项目等的情况下解决这个问题?

除非您 运行 psql 启用了 tuples_only 设置,否则查询的输出是

   array_agg   
═══════════════
 {foo,bar,etc}
(1 row)

从这里我们可以看出,在没有显式标签的情况下,Postgresql 为输出列分配了 array_agg 标签。

SQLAlchemy 行对象“知道”它们包含的列名,因此如果您将它们转换为映射,例如:

>>> with engine.connect() as conn:
...     result = conn.execute(sa.select(array_agg(category.c.name)))
...     print(list(result.mappings()))

你得到

[{'array_agg_1': ['foo', 'bar', 'etc']}]

但是,如果我直接将结果转换为列表,同时调用结果的 scalar_one() 方法来指示我期望单行,我会得到所需的输出:

>>> with engine.connect() as conn:
...     result = conn.execute(sa.select(array_agg(category.c.name)))
...     print(list(result.scalar_one()))
... 
['foo', 'bar', 'etc']
>>>