我在使用peewee的fn构造将字符串文字参数传递给SQL函数时遇到了问题。我有一个对象定义为:
class User(BaseModel):
computingID = CharField()
firstName = CharField()
lastName = CharField()
role = ForeignKeyField(Role)
lastLogin = DateTimeField()
class Meta:
database = database
我正在尝试在select中使用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()。我错过了什么,或者这是正确的答案吗?
答案 0 :(得分: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