Flask-sqlalchemy增删改查之(删除数据)
类似更新数据, 也存在两种删除数据的方案:
1.先查询, 再删除:对应SQL中的 先select, 再delete
2.基于过滤条件的删除 (推荐方案):对应SQL中的 delete xx where xx = xx (也称为 delete子查询 )
1.先查询, 再删除
操作步骤如下:
1.执行查询语句, 获取目标模型对象
2.将模型对象从会话中删除
3.提交会话
代码示例:
@app.route('/del')
def delete():
"""删除数据"""
# 方式1: 先查后删除
goods = Goods.query.filter(Goods.name == '方便面').first()
# 删除数据
db.session.delete(goods)
# 提交会话 增删改都要提交会话
db.session.commit()
return "index"
这种方式的缺点:查询和删除分两条语句, 效率低
2.基于过滤条件的删除
这种方式的优点:
- 一条语句, 被网络IO影响程度低, 执行效率更高
- 会对满足过滤条件的所有记录进行删除, 可以实现批量删除处理
操作步骤如下:
- 配合 查询过滤器filter() 和 删除执行器delete() 进行数据删除
- 提交会话
代码示例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 相关配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True
# 创建组件对象
db = SQLAlchemy(app)
# 构建模型类 商品表
class Goods(db.Model):
__tablename__ = 't_good'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
count = db.Column(db.Integer)
@app.route('/del')
def delete():
"""删除数据"""
# 方式2: delete子查询
Goods.query.filter(Goods.name == '方便面').delete()
# 提交会话
db.session.commit()
return "index"
if __name__ == '__main__':
# 重置数据库数据
db.drop_all()
db.create_all()
# 添加一条测试数据
goods = Goods(name='方便面', count=1)
db.session.add(goods)
db.session.commit()
app.run(debug=True)
注意点:
增删改操作都需要提交会话, 对应事务中进行数据库变化后提交事务