【发布时间】:2021-06-11 22:09:28
【问题描述】:
我有一个数据库表,其中列出了玩游戏的时间。我现在正在查询此表以收集数据以显示在图表中,以便很好地了解过去一年每月玩的游戏数量。
以下工作完美无缺,直到 covid-19 锁定我们,我们开始看到几个月零游戏。 :-/
data_db = list(
games.group_by("year")
.group_by("month")
.order_by(desc("year"))
.order_by(desc("month"))
.limit(12)
.values(
func.extract("year", Game.created).label("year"),
func.extract("month", Game.created).label("month"),
func.count().label("games"),
)
)
在哪里
games = Game.query.filter(
Game.started.isnot(None), Game.no_players.isnot(-1), Game.room == room
)
和游戏一个 SQLAlchemy 模型。
这会产生 [(2020, 2, 20), (2020, 3, 65), (2020, 5, 3), ...] 形式的数据,在此示例中没有 2020 年 4 月的数据。然后,生成的条形图将显示所有非零月份的数据,当然不能真实显示现实情况。
我开始研究通过加入动态生成的日历表来扩展 SQLAlchemy 查询以包括零个月的方法,但并没有真正走得太远。顺便说一下,底层数据库是 SQLite。
我现在已经“解决”了Python中的情况如下:
data_raw = []
for date in rrule.rrule(
rrule.MONTHLY,
dtstart=datetime.now() - relativedelta.relativedelta(months=11),
until=datetime.now(),
):
for dbdata in data_db:
if dbdata[0:2] == (date.year, date.month):
data_raw.append(dbdata)
break
else:
data_raw.append((date.year, date.month, 0))
这当然有效,但让我嘴里有点酸味。
由于数据集非常小,这更像是一个镀金问题,而不是一个真正的性能问题,但我仍然想看看是否有一个仅限 SQLAlchemy 的解决方案。
(我想图形库(在这种情况下为 Chart.js)也许也可以填补这些空白,但我没有考虑。)
【问题讨论】:
标签: python sqlite sqlalchemy