如何将字符串文字参数传递给peewee fn调用

时间:2014-03-04 04:13:18

标签: peewee flask-peewee

我在使用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 FROM user 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()。我错过了什么,或者这是正确的答案吗?

1 个答案:

答案 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