У меня есть класс, в котором хранится содержимое сообщения, автор и время публикации.
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()
но это не работает.
Используйте параметр order_by
.
Например: db.session.query(Post).order_by(Post.id.desc()).limit(5).all()
Я думаю, что это проблема с типом данных, который вы использовали. Измените поле String
на Date
в поле.
Как изменить его на дату? Я сделал time = db.Column(date) и получил sqlalchemy.exc.ArgumentError: объект SchemaItem, такой как ожидаемый столбец или ограничение, получил <class 'datetime.date'>
time = db.Column(db.DateTime)
Хм до сих пор не работает. Каков ваш импорт? Я импортировал только из flask_sqlalchemy import SQLAlchemy
Я включил некоторые из моих импортов в код
Я использовал db.datetime в столбце, но все равно получаю ошибку такого рода: sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Параметр привязки ошибки 2 - вероятно, неподдерживаемый тип. [SQL: ВСТАВИТЬ В сообщение (название, содержание, автор, время) ЗНАЧЕНИЯ (?, ?, ?, ?)] [параметры: ('a', 'a', <Пользователи 1>, '2020-12-22 08 :03:36.828497')] ничего не выдерживает
Измените тип данных в вашей базе данных.
Ошибка вашего кода на самом деле не из базы данных, как вы могли бы видеть. Это действительно связано с тем, что вы передаете пользовательский объект в виде строки в столбце «автор». Просто используйте что-то еще для столбца автора, например, его имя или идентификатор, если он у вас есть. Пытаться:
post= Post(title, content, Users.query.filter_by(email=session['email']).first().id)
db.session.add(post)
db.session.commit()
Теперь отлично работает с моей базой данных. Знаете ли вы, как я могу запросить объект пользователя в целом в столбец. У меня ничего не настроено для чтения в id.
Обычно я использую Post.query.filter_by(param=param). Есть ли способ сделать вашу строку кода в таком формате? Я пробовал это: Post.query.order_by(time).limit(5).all(), но это не работает, потому что это элемент datetime date.today(). Как мне это обойти?