我正在尝试将相当短的SQL转换为sqlAlchemy
ORM查询。SQL使用Postgresgenerate_series
来创建一组日期,而我的目标是创建一组按列之一分类的时间序列数组。
这些表(简化后)非常简单:
counts:
-----------------
count (Integer)
day (Date)
placeID (foreign key related to places)
"counts_pkey" PRIMARY KEY (day, placeID)
places:
-----------------
id
name (varchar)
我需要的输出是每个地方的时间序列,包括当一天未报告计数时的空值。例如,这将对应于四天的系列:
array_agg | name
-----------------+-------------------
{NULL,0,7,NULL} | A Place
{NULL,1,NULL,2} | Some other place
{5,NULL,3,NULL} | Yet another
我可以很容易地做到这一点,方法是CROSS JOIN
确定一个日期范围和地点,并将其与计数结合起来:
SELECT array_agg(counts.count), places.name
FROM generate_series('2018-11-01', '2018-11-04', interval '1 days') as day
CROSS JOIN places
LEFT OUTER JOIN counts on counts.day = day.day AND counts.PlaceID = places.id
GROUP BY places.name;
我似乎无法弄清楚的是如何让SQLAlchemy做到这一点。经过大量的挖掘,我发现了一个旧的Google网上论坛线程,该线程几乎可以正常工作,导致了这一点:
date_list = select([column('generate_series')])\
.select_from(func.generate_series(backthen, today, '1 day'))\
.alias('date_list')
time_series = db.session.query(Place.name, func.array_agg(Count.count))\
.select_from(date_list)\
.outerjoin(Count, (Count.day == date_list.c.generate_series) & (Count.placeID == Place.id ))\
.group_by(Place.name)
这会为时间序列创建子选择,但会产生数据库错误:
有一个表“ places”的条目,但是不能在查询的这一部分中引用它。
所以我的问题是:您将如何在sqlalchemy中做到这一点。另外,我很容易接受这样的想法,因为我使用SQL的方法是头脑僵硬的。
问题在于,给定查询构造SQLAlchemy会按照以下方式生成查询:
SELECT ...
FROM places,
(...) AS date_list LEFT OUTER JOIN count ON ... AND count."placeID" = places.id
...
有2个FROM
-list项:places
和联接。项不能交叉引用相互1,因此,误差是由于places.id
在ON
-clause。
SQLAlchemy不支持显式CROSS JOIN
,但另一方面,aCROSS JOIN
等效于INNER JOIN ON (TRUE)
。您还可以省略将函数表达式包装在子查询中,并通过给它一个别名来按原样使用它:
date_list = func.generate_series(backthen, today, '1 day').alias('gen_day')
time_series = session.query(Place.name, func.array_agg(Count.count))\
.join(date_list, true())\
.outerjoin(Count, (Count.day == column('gen_day')) &
(Count.placeID == Place.id ))\
.group_by(Place.name)
1:函数调用项FROM
除外,或使用LATERAL
。
为什么Postgres不允许我在JOIN中使用聚合函数? 错误:列“min_price”不存在第19行:且price=min_price^提示:表“h1”中有一个名为“min_price”的列,但无法从查询的这一部分引用该列。
本文向大家介绍sqlalchemy 使用连接,包括了sqlalchemy 使用连接的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用上下文管理器打开连接(即从池中请求一个连接): 有无,但必须手动将其关闭:
问题内容: 将数组分组为单个数组时遇到问题。我们希望将两列中的值连接到一个单个数组中,并将这些包含多个行的数组聚合在一起。 给出以下输入: 我们需要以下输出: 元素的顺序很重要,并且应与聚合行的ID相关联。 我们尝试了以下功能: 不幸的是,此语句引发了一个错误: 似乎不可能使用来合并group by子句中的数组。 有任何想法吗? 问题答案: 您可以先进行“反向旋转” : 适应产生您以后要求的值的顺
问题内容: 有没有一种方法可以在SQLAlchemy中构建与以下对象等效的对象: 根据我在文档中看到的内容,该子句仅与一起使用。 问题答案: 插入中的“ VALUES”是标准SQL,独立的“ VALUES”关键字是Postgresql。PGValues上有一份针对此的快速编译器配方(如果有一天我更改了维基,请在此处复制):
问题内容: 我正在尝试在sqlalchemy中执行此查询 我想在执行时绑定列表。 问题答案: 怎么样 编辑 :没有ORM,它将是 需要两个参数,第一个是要检索的字段列表,第二个是条件。您可以通过(或)属性访问表对象上的所有字段。
问题内容: 我正在使用两个MySQL数据库。我想将DB1中的表与SQLAlchemy中DB2中的表连接起来。 我在sqlalchemy中创建数据访问层时正在使用automap_base,如下所示… 我的表类就像 我正在这样加入 我收到这样的错误: 我们在数据库db1中创建了表t1,在数据库db2中创建了表t2。 是否可以在sqlalchemy ORM中的两个数据库表之间进行联接?如何实现呢? 问题