python + SQLAlchemy:使用Session对象删除

问题描述 投票:0回答:4

我不太明白这一点:我想从匹配查询的表中删除所有记录。有点像这样。

engine = sqlalchemy.create_engine(string)
meta = MetaData(bind=engine)
meta.reflect(bind=engine, schema='myschema')

Base = automap_base(metadata=meta)
Base.prepare(engine, reflect=True)
Classes = Base.classes

Session = sessionmaker(bind=engine)
session = Session()

session.delete(plays.record_id == '123')

但这不起作用。这是什么想法?我得到的错误是:

error in parsing record ID 020087: Class 'sqlalchemy.sql.elements.BinaryExpression' is not mapped

python sqlalchemy
4个回答
109
投票

在 SQL Alchemy 中,您正在删除通过数据库查询获得的对象。您可以通过两种方式做到这一点:

使用查询删除(仅发出一个

DELETE
语句):

session.query(User).filter(User.id==7).delete()
session.commit()

删除查询返回的对象实例(将发出 2 条语句:首先

SELECT
,然后
DELETE
):

obj=session.query(User).filter(User.id==7).first()
session.delete(obj)
session.commit()

33
投票

删除所有记录

#for all records
session.query(Model).delete()
session.commit()

删除单行

如果您想删除特定记录,请尝试在查询中使用

filter
子句。 例如。

#for specific value
session.query(Model).filter(Model.id==123).delete()
session.commit()

按对象删除单条记录

record_obj = session.query(Model).filter(Model.id==123).first()
session.delete(record_obj)
session.commit()

https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/#deleting-records


0
投票

删除多条记录

session.query(User).where(User.id.in_([1,2,3,4])).delete()
session.commit()

0
投票

in 2.x

obj = session.query(Model).filter(Model.id==123).first()
session.delete(obj)
session.commit()

TL;博士


# CAREFUL!!! What may be correct in a simple scenario will confuse you in a complex one.
##### session.query(User).filter(User.id==123).delete()

Session.delete()
,是工作单元

在2.0版本中。对于新手来说,应该推荐

session.delete()
,因为它会帮你处理人际关系部分的很多脏活。

我使用

Query.delete()
是因为我读了
muthan
答案,这导致了一个错误的长时间调试,当我编写多对多演示时,关系不会触发。

在新文档中,几乎总是 Session.deleteexpression.delete,第一次使用时,请注意阅读其下方的红色警告! 查询.删除

更多关于此的官方文章:启用 ORM 的更新和删除的重要说明和警告

© www.soinside.com 2019 - 2024. All rights reserved.