Skip to content

三、ORM模型的CRUD操作

一、CRUD

1、Create操作

python
@app.route("/add")
def user_add():
    user=User(username="小明",password="123456")
    db.session.add(user)
    db.session.commit()
    return "新增用户信息成功"

2、Read操作

python
@app.route("/query")
def user_query():
    # user=User.query.get(1)      # get查找:根据主键查找
    users=User.query.filter_by(username="小明")
    for user in users:
        print(f"{user.username}  {user.password}")
    return "查询用户信息成功"

(1)提取数据的常用方法

方法名描述
query.all()获取查询结果集中的所有对象,是列表类型
query.first()获取查询结果集中的第一个对象
query.one()获取查询结果集中的一个对象,如果结果集中对象数量不等于1,则会抛出异常
query.one_or_none()query.one()方法类似,结果集中对象数量不等于1时,不是抛出异常,而是返回 None
query.get(pk)根据主键获取当前 ORM 模型的第一条数据
query.exists()判断数据是否存在
query.count()获取查询结果集的个数
  1. 获取User中所有数据

    python
    users=User.query.all()
  2. 获取主键为1的User对象

    python
    user=User.query.get(1)
  3. 获取第一条数据

    python
    user=User.query.first()

(2)常用的过滤方法

方法名描述
query.filter()根据查询条件过滤
query.filter_by()根据关键字参数过滤
query.slice(start,stop)对结果进行切片操作
query.limit(limit)对结果数量进行限制
query.offset(offset)在查询时跳过前面 offset 条数据
query.order_by()根据给定字段进行排序
query.group_by()根据给定字段进行分组
  1. query.order_by

    python
    # 正序排序
    users=User.query.order_by("id")
    users=User.query.order_by(User.id)
    
    # 倒序排序
    users=User.query.order_by(db.Text("-id"))
    users=User.query.order_by(User.id.desc())
    
    from sqlalchemy import desc
    users=User.query.order_by(desc("id"))
  2. query.group_by()

    query.group_by()方法是根据某个字段进行分组,分组的主要目的是获取分组 后的数量,最大值,最小值,平均值,总和等

    因为提取的数据不再是某个模型(分组后的数据),所以不能通过<模型>.query的方式获取,而是通过db.session.query来提取

    统计每个用户名下的记录数量

    python
    from sqlalchemy import func
    
    users=db.session.query(User.username,func.count(User.id)).group_by("username").all()
  3. query.filter()

    1. like:模糊查询

      python
      users=User.query.filter(User.username.contains("张"))
      users=User.query.filter(User.username.like("%张%"))
    2. in:判断值是否在指定的数据集中,如果是就提取,否则就不提取

      python
      users=User.query.filter(User.username.in_(["张三","李四","王五"]))
    3. not in:作用与in_相反,使用方法是在in_方法所在表达式前添加~

      python
      users=User.query.filter(~User.username.in_["张三"])
    4. is null:判断值是否为空,如果为空就提取,否则就不提取、

      python
      users=User.query.filter(User.username.is_(None))
    5. is not null:作用与is null相反

      python
      users=User.query.filter(User.username.isnot(None))
    6. and:用于同时满足多条件的查询

      python
      from sqlalchemy import and
      users=User.query.filter(and_(User.username=="张三",User.id<10))
    7. or:用于满足一个或多个条件的查询

      python
      from sqlalchemy import or
      users=User.query.filter(or_(User.username=="张三",User.username=="李四"))

3、Update操作

(1)单次修改

python
@app.route("/update")
def user_update():
    user=User.query.get(1)
    user.password="aaaaaa"
    db.session.commit()
    return "更新用户信息成功"

(2)批量修改

针对修改多条数据的情况,则是通过调用filter或者filter_by方法获取BaseQuery对象,然后再调用update方法,实现批量修改

synchronize_session=False 参数告诉 SQLAlchemy 不要同步会话,即不要在删除操作后立即更新会话中的对象状态

python
User.query.filter(User.username.like("%张三%")).update(
    {
		"password":User.password+"被修改的"
	},
	synchronize_session=False
)
db.session.commit()

4、Delete操作

(1)单次删除

python
@app.route("/delete")
def user_delete():
    user=User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "删除用户信息成功"

(2)批量删除

synchronize_session=False 参数告诉 SQLAlchemy 不要同步会话,即不要在删除操作后立即更新会话中的对象状态

python
User.query.filter(User.username.contains("张飞").delete(
	synchronize_session=False
)