peewee select() return SQL 查询,不是实际数据

peewee select() return SQL query, not the actual data

我正在尝试对两列中的值求和,然后 运行按天分类我的日期字段。我构建了 SQL 查询来执行此操作(有效):

SELECT date_trunc('day', date) AS Day, SUM(fremont_bridge_nb) AS 
Sum_NB, SUM(fremont_bridge_sb) AS Sum_SB FROM bike_count GROUP BY Day 
ORDER BY Day;

但是当我尝试将其格式化为 peewee 时,我 运行 遇到了问题:

Bike_Count.select(fn.date_trunc('day', Bike_Count.date).alias('Day'),
fn.SUM(Bike_Count.fremont_bridge_nb).alias('Sum_NB'),
fn.SUM(Bike_Count.fremont_bridge_sb).alias('Sum_SB'))
.group_by('Day').order_by('Day')

我没有收到任何错误,但是当我打印出我存储它的变量时,它显示:

 <class 'models.Bike_Count'> SELECT date_trunc(%s, "t1"."date") AS 
Day, SUM("t1"."fremont_bridge_nb") AS Sum_NB, 
SUM("t1"."fremont_bridge_sb") AS Sum_SB FROM "bike_count" AS t1 ORDER 
BY %s ['day', 'Day']

我在Python中唯一成功获取数据的是:

 Bike_Count.get(Bike_Count.id == 1).date

如果您只是将一个字符串粘贴到您的分组依据/排序依据中,Peewee 将尝试将其参数化为一个值。这是为了避免 SQL 注入 haxx.

要解决此问题,您可以在 group_by()order_by() 调用中使用 SQL('Day') 代替 'Day'

另一种方法是将函数调用粘贴到 GROUP BYORDER BY 中。以下是您的操作方式:

day = fn.date_trunc('day', Bike_Count.date)
nb_sum = fn.SUM(Bike_Count.fremont_bridge_nb)
sb_sum = fn.SUM(Bike_Count.fremont_bridge_sb)

query = (Bike_Count
         .select(day.alias('Day'), nb_sum.alias('Sum_NB'), sb_sum.alias('Sum_SB'))
         .group_by(day)
         .order_by(day))

或者,如果您愿意:

query = (Bike_Count
         .select(day.alias('Day'), nb_sum.alias('Sum_NB'), sb_sum.alias('Sum_SB'))
         .group_by(SQL('Day'))
         .order_by(SQL('Day')))