我不太明白这一点:我想从匹配查询的表中删除所有记录。有点像这样。
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
在 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()
删除所有记录
#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
删除多条记录
session.query(User).where(User.id.in_([1,2,3,4])).delete()
session.commit()
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.delete 和 expression.delete,第一次使用时,请注意阅读其下方的红色警告! 查询.删除
更多关于此的官方文章:启用 ORM 的更新和删除的重要说明和警告