Как использовать порядок в колбе sqlalchemy для атрибута даты - PullRequest
0 голосов
/ 21 марта 2019

У меня есть приложение фляги, и я использую флешку 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 голосов
/ 21 марта 2019

измените 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 (все объекты получили бы одинаковое время по умолчанию).

...