1

我在使用 peewee 的 fn 构造将字符串文字参数传递给 SQL 函数时遇到问题。我有一个对象定义为:

class User(BaseModel):
    computingID = CharField()
    firstName = CharField()
    lastName = CharField()
    role = ForeignKeyField(Role)
    lastLogin = DateTimeField()
    class Meta:
        database = database

我试图在选择中使用 mySQL timestampdiff 函数来获取自上次登录以来的天数。查询应如下所示:

SELECT t1.`id`, t1.`computingID`, t1.`firstName`, t1.`lastName`, t1.`role_id`, t1.`lastLogin`, timestampdiff(day, t1.`lastLogin`, now()) AS daysSinceLastLogin FROM `user` AS t1

这是我正在尝试使用的 python peewee 代码:

bob = User.select(User, fn.timestampdiff('day', User.lastLogin, fn.now()).alias('daysSinceLastLogin'))
result = bob[0].daysSinceLastLogin

但是当我执行这段代码时,我得到一个错误:

ProgrammingError: (1064, u"您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在 ''day', t1 附近使用的正确语法。lastLogin, now()) AS daysSinceLastLogin FROM userAS t1 '在第 1 行")

从这条消息来看,“day”参数周围的引号似乎保留在 peewee 生成的 SQL 中。而且 mySQL 不喜欢参数周围的引号。我显然不能离开python代码中的引号,所以有人可以告诉我我做错了什么吗?

更新:通过使用 SQL() peewee 命令添加 DAY 参数,我的查询按预期工作,没有引号:

User.select(User, fn.timestampdiff(SQL('day'), User.lastLogin, fn.now()).alias('daysSinceLastLogin'))

但我不确定为什么在这种情况下必须使用 SQL()。我错过了什么,还是这是正确的答案?

4

1 回答 1

0

您是否有理由需要使用 SQL 函数来执行此操作?

部分是因为我对 SQL 函数不太熟悉,我可能会做这样的事情:

import datetime as dt
bob = user.get(User = "Bob") #or however you want to get the User instance
daysSinceLastLogin = (dt.datetime.now() - bob.lastLogin).days
于 2014-03-04T04:25:07.737 回答