我在使用 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 FROMuser
AS t1 '在第 1 行")
从这条消息来看,“day”参数周围的引号似乎保留在 peewee 生成的 SQL 中。而且 mySQL 不喜欢参数周围的引号。我显然不能离开python代码中的引号,所以有人可以告诉我我做错了什么吗?
更新:通过使用 SQL() peewee 命令添加 DAY 参数,我的查询按预期工作,没有引号:
User.select(User, fn.timestampdiff(SQL('day'), User.lastLogin, fn.now()).alias('daysSinceLastLogin'))
但我不确定为什么在这种情况下必须使用 SQL()。我错过了什么,还是这是正确的答案?