我有一个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的新手。
答案 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
的时间(所有对象将获得相同的默认时间)。