rgw*_*ver 2 sql sqlite python-3.x peewee
我正在使用peewee2.1与python3.3和sqlite3.7数据库.
我想执行某些SELECT查询,其中:
我的数据库有一个'Event'表,每个事件有1条记录,还有一个'Ticket'表,每个事件有1..N票.每个故障单记录都包含事件的id作为外键.每张票还包含一个"席位"列,用于指定购买的座位数.("票"最好被认为是活动中一个或多个席位的购买交易.)
下面是两个使用这种SQLite查询的例子,它给了我想要的结果:
SELECT ev_tix, count(1) AS ev_tix_n FROM
(SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id)
GROUP BY ev_tix
SELECT seat_tot, count(1) AS seat_tot_n FROM
(SELECT sum(seats) AS seat_tot FROM ticket GROUP BY event_id)
GROUP BY seat_tot
Run Code Online (Sandbox Code Playgroud)
但是使用Peewee,我不知道在指定外部查询时如何选择内部查询的聚合(计数或总和).我当然可以为该聚合指定一个别名,但似乎我不能在外部查询中使用该别名.
我知道Peewee有一个执行"原始"SQL查询的机制,我已经成功地使用了这种解决方法.但我想了解是否/如何使用Peewee直接完成这些查询.
我在peewee-orm Google小组上发布了同样的问题.Charles Leifer迅速回应了对小便大师的回答和新的承诺.因此,虽然我正在回答我自己的问题,但显然所有的归功于他.
您可以在此处查看该主题:https://groups.google.com/forum/#!topic / peewee -orm/FSHhd9lZvUE
但这是必不可少的部分,我从Charles对我的帖子的回复中复制了这个部分:
我已经添加了几个提交到master,这应该使您的查询成为可能(https://github.com/coleifer/peewee/commit/22ce07c43cbf3c7cf871326fc22177cc1e5f8345).
以下是您的第一个示例的粗略语法:
Run Code Online (Sandbox Code Playgroud)SELECT ev_tix, count(1) AS ev_tix_n FROM (SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id) GROUP BY ev_tix ev_tix = SQL('ev_tix') # the name of the alias. (Ticket .select(ev_tix, fn.count(ev_tix).alias('ev_tix_n')) .from_( Ticket.select(fn.count(Ticket.id).alias('ev_tix')).group_by(Ticket.event)) .group_by(ev_tix))这会产生以下SQL:
Run Code Online (Sandbox Code Playgroud)SELECT ev_tix, count(ev_tix) AS ev_tix_n FROM (SELECT Count(t2."id") AS ev_tix FROM "ticket" AS t2 GROUP BY t2."event_id") GROUP BY ev_tix