切换主题
三、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() | 获取查询结果集的个数 |
获取User中所有数据
pythonusers=User.query.all()
获取主键为1的User对象
pythonuser=User.query.get(1)
获取第一条数据
pythonuser=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() | 根据给定字段进行分组 |
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"))
query.group_by()
query.group_by()
方法是根据某个字段进行分组,分组的主要目的是获取分组 后的数量,最大值,最小值,平均值,总和等因为提取的数据不再是某个模型(分组后的数据),所以不能通过
<模型>.query
的方式获取,而是通过db.session.query
来提取统计每个用户名下的记录数量
pythonfrom sqlalchemy import func users=db.session.query(User.username,func.count(User.id)).group_by("username").all()
query.filter()
like
:模糊查询pythonusers=User.query.filter(User.username.contains("张")) users=User.query.filter(User.username.like("%张%"))
in
:判断值是否在指定的数据集中,如果是就提取,否则就不提取pythonusers=User.query.filter(User.username.in_(["张三","李四","王五"]))
not in
:作用与in_
相反,使用方法是在in_
方法所在表达式前添加~
pythonusers=User.query.filter(~User.username.in_["张三"])
is null
:判断值是否为空,如果为空就提取,否则就不提取、pythonusers=User.query.filter(User.username.is_(None))
is not null
:作用与is null
相反pythonusers=User.query.filter(User.username.isnot(None))
and
:用于同时满足多条件的查询pythonfrom sqlalchemy import and users=User.query.filter(and_(User.username=="张三",User.id<10))
or
:用于满足一个或多个条件的查询pythonfrom 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
)