【问题标题】:How to delete a record by id in Flask-SQLAlchemy如何在 Flask-SQLAlchemy 中按 id 删除记录
【发布时间】:2015-01-25 08:05:30
【问题描述】:

我的 MySql 数据库中有 users 表。此表有idnameage 字段。

如何删除id的一些记录?

现在我使用以下代码:

user = User.query.get(id)
db.session.delete(user)
db.session.commit()

但我不想在删除操作之前进行任何查询。有没有办法做到这一点?我知道,我可以使用db.engine.execute("delete from users where id=..."),但我想使用delete() 方法。

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你可以这样做,

    User.query.filter_by(id=123).delete()
    

    User.query.filter(User.id == 123).delete()
    

    确保commitdelete()生效。

    【讨论】:

    • 确保你把db.session.commit()放在最后。数据库在哪里:db = SQLAlchemy(app)
    • 这个方法可以用IN吗?
    • 警告:如果你依赖 python/ORM 中的级联,这样的delete 将不会级联。你需要query the object first, and then delete
    • 如果User 不存在会怎样?
    • 以上是直接的 sql DELETE 语句,不涉及在删除之前将对象加载到 orm 中,@nirvana-msu 是正确的,因为 db 不知道在orm级别的关系。如果您可以在外键声明中设置它们(即在 db 级关系中),则级联将正常工作(例如Column('parent_id', ForeignKey('parents.id', ondelete='cascade')))。
    【解决方案2】:

    只想分享另一个选项:

    # mark two objects to be deleted
    session.delete(obj1)
    session.delete(obj2)
    
    # commit (or flush)
    session.commit()
    

    http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#deleting

    在这个例子中,下面的代码应该可以正常工作:

    obj = User.query.filter_by(id=123).one()
    session.delete(obj)
    session.commit()
    

    【讨论】:

    • 当您运行日志时,此选项非常好,因为它使您能够进行查询并记录一些您的用户认为无关紧要的内容。这样,当他们询问您为什么缺少该记录时,您可以向他们显示日志!
    【解决方案3】:

    另一种可能的解决方案,特别是如果您想批量删除

    deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
    session.execute(deleted_objects)
    session.commit()
    

    【讨论】:

    • 这非常好,因为有时用户名是空的或有 Unicode 字符。按ID删除是黄金。斯帕西博 :)
    【解决方案4】:

    在 sqlalchemy 1.4(2.0 风格)中,您可以这样做:

    from sqlalchemy import select, update, delete, values
    
    sql1 = delete(User).where(User.id.in_([1, 2, 3]))
    sql2 = delete(User).where(User.id == 1)
    
    db.session.execute(sql1)
    db.session.commit()
    

    u = db.session.get(User, 1)
    db.session.delete(u)
    db.session.commit()
    

    在我看来,使用 select、update、delete 更具可读性。 样式比较 1.0 vs 2.0 可以找到here

    【讨论】:

    • 这个答案应该更高。
    • 我知道,当我在 stackoverflow 上学习 sqlalchemy 时,有一些旧样式的示例,甚至很难弄清楚有两种样式。新风格(2.0)更像是写sql。但是用and_or_在新风格下很丑呵呵
    猜你喜欢
    • 2020-08-17
    • 2021-11-24
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多