如何在flask sqlalchemy中使用order by设置date属性

时间:2019-03-21 11:09:29

标签: flask sqlalchemy flask-sqlalchemy

我有一个flask应用程序,我正在使用flask sqlalchemy。我有两个类似的类:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    diaries = db.relationship('Diary', backref='author', lazy=True)


    def __repr__(self):
        return f"User('{self.username}', '{self.email}')"


class Diary(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    diary_date= db.Column(db.DateTime, nullable=False, default=datetime.now())
    emotion = db.Column(db.String(10))
    note = db.Column(db.Text)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Diary('{self.diary_date}', '{self.emotion}','{self.note}')"

我想使用diary_date进行排序,然后记录前七个记录。我想向用户展示一周内的频繁情绪。对于排序,我使用了以下查询:

>>> records=(db.session.query(Diary).filter_by(Diary.user_id=User.id).join(Diary
,User.diaries).order_by(Diary.diary_date))

出现错误

  File "<stdin>", line 1
SyntaxError: keyword can't be an expression

查询是否错误?您可以提出更好的查询吗?如果问题太愚蠢,我是sqlalchemy的新手。

1 个答案:

答案 0 :(得分:0)

filter_by更改为filter并将=替换为==。它将解决您的错误:

db.session.query(Diary).filter(Diary.user_id==User.id).join(Diary,User.diaries).order_by(Diary.diary_date)

这给你:

SELECT diary.id AS diary_id, diary.diary_date AS diary_diary_date, diary.emotion AS diary_emotion, diary.note AS diary_note, diary.user_id AS diary_user_id 
FROM user JOIN diary ON user.id = diary.user_id 
WHERE diary.user_id = user.id ORDER BY diary.diary_date

但是如您所见,WHERE diary.user_id = user.id是不必要的,因为JOIN表达式已将其覆盖。可以安全地将其删除。


您还可以将default=datetime.now()更改为default=datetime.now。由于将diary_date设置为创建Diary对象的时间,而不是设置为由解释器解析Diary的时间(所有对象将获得相同的默认时间)。