如何在 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
表。此表有id
、name
和age
字段。
如何删除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()
确保commit
delete()
生效。
【讨论】:
确保你把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 删除记录的主要内容,如果未能解决你的问题,请参考以下文章