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")
このメッセージから判断すると、peewee が生成している SQL では、'day' パラメーターを囲む引用符が保持されているようです。また、mySQL はパラメーターを引用符で囲むことを好みません。私は明らかにpythonコードの引用符を外すことができないので、誰かが私が間違っていることを教えてもらえますか?
更新: SQL() peewee コマンドを使用して DAY パラメータを追加することで、クエリが意図したとおりに機能するようになりました。
User.select(User, fn.timestampdiff(SQL('day'), User.lastLogin, fn.now()).alias('daysSinceLastLogin'))
しかし、なぜこの状況で SQL() を使用しなければならなかったのかわかりません。何か不足していますか、それともこれが正しい答えですか?