Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PostgreSQL/SqlAlchemy选择数组的第一项_Python_Postgresql_Sqlalchemy - Fatal编程技术网

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(由于不好的原因我没有导入),但在其他方面工作起来很有魅力。谢谢