Flask SQLAlchemy: как получить 5 последних строк?

У меня есть класс, в котором хранится содержимое сообщения, автор и время публикации.

from datetime import timedelta, datetime
from flask_sqlalchemy import SQLAlchemy


class Post(db.Model):
    _id = db.Column("id", db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    contents = db.Column(db.String(700))
    author = db.Column(db.String(100))
    time = db.Column(db.DateTime)
    
    def __init__(self, title, contents, author):
        self.title = title
        self.contents = contents
        self.author = author
        self.time = datetime.now()

Мой вопрос: как мне получить 5 последних сообщений? Для этого я использую Flask с SQL Alchemy. Я пытался

print(db.session.query(Post).order_by(Post.time.desc()).limit(5).all())
....
post= Post(title, content, Users.query.filter_by(email=session['email']).first())
db.session.add(post)
db.session.commit()

но это не работает.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 091
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте параметр order_by.

Например: db.session.query(Post).order_by(Post.id.desc()).limit(5).all()

Обычно я использую Post.query.filter_by(param=param). Есть ли способ сделать вашу строку кода в таком формате? Я пробовал это: Post.query.order_by(time).limit(5).all(), но это не работает, потому что это элемент datetime date.today(). Как мне это обойти?

James Huang 21.12.2020 07:14

Я думаю, что это проблема с типом данных, который вы использовали. Измените поле String на Date в поле.

itsAPK 21.12.2020 07:18

Как изменить его на дату? Я сделал time = db.Column(date) и получил sqlalchemy.exc.ArgumentError: объект SchemaItem, такой как ожидаемый столбец или ограничение, получил <class 'datetime.date'>

James Huang 21.12.2020 08:22
time = db.Column(db.DateTime)
itsAPK 21.12.2020 08:52

Хм до сих пор не работает. Каков ваш импорт? Я импортировал только из flask_sqlalchemy import SQLAlchemy

James Huang 21.12.2020 21:08

Я включил некоторые из моих импортов в код

James Huang 22.12.2020 09:11
flask-sqlalchemy.palletsprojects.com/en/2.x/models См. это
itsAPK 22.12.2020 09:13

Я использовал db.datetime в столбце, но все равно получаю ошибку такого рода: sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Параметр привязки ошибки 2 - вероятно, неподдерживаемый тип. [SQL: ВСТАВИТЬ В сообщение (название, содержание, автор, время) ЗНАЧЕНИЯ (?, ?, ?, ?)] [параметры: ('a', 'a', <Пользователи 1>, '2020-12-22 08 :03:36.828497')] ничего не выдерживает

James Huang 22.12.2020 09:15

Измените тип данных в вашей базе данных.

itsAPK 23.12.2020 07:22
Ответ принят как подходящий

Ошибка вашего кода на самом деле не из базы данных, как вы могли бы видеть. Это действительно связано с тем, что вы передаете пользовательский объект в виде строки в столбце «автор». Просто используйте что-то еще для столбца автора, например, его имя или идентификатор, если он у вас есть. Пытаться:

post= Post(title, content, Users.query.filter_by(email=session['email']).first().id)
db.session.add(post)
db.session.commit()

Теперь отлично работает с моей базой данных. Знаете ли вы, как я могу запросить объект пользователя в целом в столбец. У меня ничего не настроено для чтения в id.

James Huang 22.12.2020 09:52

Другие вопросы по теме