如何在 Flask-SQLAlchemy 中按 id 删除记录

Posted

技术标签:

【中文标题】如何在 Flask-SQLAlchemy 中按 id 删除记录【英文标题】:How to delete a record by id in Flask-SQLAlchemy 【发布时间】: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() 方法。

【问题讨论】:

【参考方案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。

【讨论】:

这个答案应该更高。 我知道,当我在 *** 上学习 sqlalchemy 时,有一些旧样式的示例,甚至很难弄清楚有两种样式。新风格(2.0)更像是写sql。但是用and_or_在新风格下很丑呵呵

以上是关于如何在 Flask-SQLAlchemy 中按 id 删除记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在freemarker模板中按索引获取列表项?

如何保存迭代编号。在matlab中按下按键

如何在codeigniter中按大小过滤产品

如何在 Celery 任务中使用 Flask-SQLAlchemy

Flask-SQLAlchemy:如何更改表结构?

如何在 NodeJS Sequelize 中按查询计算组