Python 使用PostgreSQL/SqlAlchemy选择数组的第一项
尝试将我每天运行的一些查询移动到自动脚本中。我在博士后中有一个,如下所示:Python 使用PostgreSQL/SqlAlchemy选择数组的第一项,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,尝试将我每天运行的一些查询移动到自动脚本中。我在博士后中有一个,如下所示: SELECT regexp_split_to_array(col1, "|")[1] AS item, COUNT(*) AS itemcount FROM Tabel1 GROUP BY item ORDER BY itemcount 在SqlAlchemy中,我有以下几点: session.query((func.regexp_split_to_array(model.table1.col1, "|")[1]).l
SELECT regexp_split_to_array(col1, "|")[1] AS item, COUNT(*) AS itemcount FROM Tabel1 GROUP BY item ORDER BY itemcount
在SqlAlchemy中,我有以下几点:
session.query((func.regexp_split_to_array(model.table1.col1, "|")[1]).label("item"), func.count().label("itemcount")).group_by("item").order_by("itemcount")
Python无法“获取_项”,因为它实际上不是一个集合。我浏览了文档,似乎找不到任何东西可以让我在不使用execute运行原始SQL的情况下实现这一点(我可以这样做,但我正在寻找下一次的解决方案)。SQLAlchemy确实支持使用
[…]
进行索引。如果声明的列类型必须为postgresql.ARRAY
类型,则它可以工作:
table2 = Table("table2", meta, Column("col1", postgresql.ARRAY(String)))
q = session.query(table2.c.col1[1])
print(q.statement.compile(dialect=postgresql.dialect()))
# SELECT table2.col1[%(col1_1)s] AS anon_1
# FROM table2
代码不起作用的原因是SQLAlchemy不知道func.regexp\u split\u to\u array(…)
返回数组,因为func.foo
为方便起见生成了一个泛型函数。为了使其正常工作,我们需要通过指定type\uuu
参数来确保SQLAlchemy知道函数的返回类型:
q = session.query(func.regexp_split_to_array(table1.c.col1, "|", type_=postgresql.ARRAY(String))[1].label("item"))
print(q.statement.compile(dialect=postgresql.dialect()))
# SELECT (regexp_split_to_array(table1.col1, %(regexp_split_to_array_1)s))[%(regexp_split_to_array_2)s] AS item
# FROM table1
字符串需要sqlalchemy.types(由于不好的原因我没有导入),但在其他方面工作起来很有魅力。谢谢