我正在尝试以优雅的方式删除使用Flask和SQLAchlemy的项目列表。在我的情况下,我想从我的数据库中删除旧项目(小于特定时间的项目被认为是旧的)。
这是我的python模型对象:
class ItemModel(db.Model):
__tablename__ = 'items'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
time = db.Column(db.Integer)
现在,我尝试使用以下filter_by查询删除项目:
def delete_from_db(self):
db.session.query('items').filter_by(self.time <= epoch_time).delete()
db.session.commit()
它最终给了我错误:
filter_by()采用1个位置参数,但是给出了2个
如果我使用过滤器函数尝试此操作,而不是filter_by,我也会收到错误:
def delete_from_db(self):
db.session.query('items').filter(self.time <= epoch_time).delete()
db.session.commit()
sqlalchemy.exc.InvalidRequestError:此操作只需要一个 将表或实体指定为目标。
最后,我决定回到基础并使用sql代码,这可行,但我认为它不是很优雅:
def delete_from_db(self):
from sqlalchemy.sql import text
cmd = 'delete from items where time <= :time'
db.engine.execute(text(cmd), time = epoch_time)
db.session.commit()
使用Flask和SQLAchlemy有更优雅的方法吗?
答案 0 :(得分:2)
如果你想从模型中管理它,这应该适用于类方法:
@classmethod
def delete_from_db(cls):
cls.query.filter(cls.time <= epoch_time).delete()
db.session.commit()
或相同,也许更干净,使用静态方法:
@staticmethod
def delete_from_db():
ItemModel.query.filter(ItemModel.time <= epoch_time).delete()
db.session.commit()