1

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 userAS t1 ' 行 1")

このメッセージから判断すると、peewee が生成している SQL では、'day' パラメーターを囲む引用符が保持されているようです。また、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 に答える