python - 删除 SQLAlchemy Flask 中的项目列表

标签 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)

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

def delete_from_db(self):
    db.session.query('items').filter_by(self.time <= epoch_time).delete()
    db.session.commit()

它最终给我错误:

filter_by() takes 1 positional argument but 2 were given

如果我尝试使用过滤器函数而不是 filter_by,我也会收到一个错误:

   def delete_from_db(self):
        db.session.query('items').filter(self.time <= epoch_time).delete()
        db.session.commit()

sqlalchemy.exc.InvalidRequestError: This operation requires only one Table or entity be specified as the target.

最后,我决定回到基础并使用 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 是否有更优雅的方法?

最佳答案

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

@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()

关于python - 删除 SQLAlchemy Flask 中的项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48839482/

相关文章:

Python 正则表达式 : Fix one html close tag

python - 'datetime.datetime' 对象没有属性 'read'

python - 如何在 SQLAlchemy 中模拟 `UNIQUE` 约束?

python - 将 SQLAlchemy ORM 查询结果转换为 JSON,而不是创建 ORM 对象

python - SqlAlchemy:如何在用户之间创建连接,即 make "friends"

python - 使用 Python 连接到 MS Access

python - 'HTTP 错误 400 : Bad Request' with Python Bottlenose

使用 "as"时,Python 循环引用导入不起作用

python - SQLAlchemy 过滤时出错

python - pyodbc/sqlAlchemy 启用快速执行