删除 SQLAlchemy Flask 中的项目列表

Sim*_*mon 5 python sqlalchemy

我正在尝试以优雅的方式删除使用 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)
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用以下 filter_by 查询删除项目:

def delete_from_db(self):
    db.session.query('items').filter_by(self.time <= epoch_time).delete()
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

它最终给了我错误:

filter_by() 接受 1 个位置参数,但给出了 2 个

如果我使用 filter 函数而不是 filter_by 来尝试这个,我也会收到一个错误:

   def delete_from_db(self):
        db.session.query('items').filter(self.time <= epoch_time).delete()
        db.session.commit()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

使用 Flask 和 SQLAchlemy 是否有更优雅的方法来做到这一点?

PRM*_*reu 11

如果您想从模型中管理它,这应该与类方法一起使用:

@classmethod
def delete_from_db(cls):
    cls.query.filter(cls.time <= epoch_time).delete()
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

或者同样的,也许更干净,使用静态方法:

@staticmethod
def delete_from_db():
    ItemModel.query.filter(ItemModel.time <= epoch_time).delete()
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此方法不会级联删除,而使用 db.session.delete(ItemModel.query.filter(ItemModel.time &lt;= epoch_time).first())` 级联。[此链接](https://github.com/inveniosoftware/invenio/issues/2419)在经过大量搜索和反复试验后拯救了我。 (2认同)