Flask 模型表操作 单表
class User(db.Model):
# 表名
__tablename__ = 'tb_user'
# 字段
id = db.Column(db.Integer, primary_key=True,
autoincrement=True) # 一定要有类型 primary_key=True 主键 autoincrement=True 自动增长
name = db.Column(db.String(30), unique=True, index=True)
age = db.Column(db.Integer)
def __repr__(self):
return '<User {}>'.format(self.name)
增:添加数据
# 增:添加数据
@blueprints1.route('/adduser/')
def add_user():
# 添加一条数据
'''
模型 数据库
类 表数据
类属性 表字段
一个对象 表中的一行数据
'''
user = User() # 先生成一个对应表的空对象,可以理解为空记录
# 往对象中添加对应属性的值,也就是往对应字段中添加对应的值
user.name = 'kun'
db.session.add(user) # 将user对象添加到session中,可以理解为添加到缓存
db.session.commit() # 同步到数据库中 这时真正的作用到数据库
# 同时添加多条数据
users = [] # 定义一个空列表
for i in range(10):
user = User()
user.name = 'kunkun' + str(i)
users.append(user)
try:
db.session.add_all(users)
db.session.commit() # 自带事务提交
except Exception as e:
db.session.rollback() # 回滚
db.session.flush() # 清空刷新缓存
return 'fail ' + str(e)
return 'success!'
删:删除数据
# 删:删除数据
# 找到要删除的数据,然后删除
@blueprints1.route('/deleteuser/')
def delete_user():
# 先找到删除的对象(数据)
user = User.query.first() # 查询第一条数据
db.session.delete(user)
db.session.commit()
return 'success!'
改:修改数据
# 改:修改数据
# 找到要修改的数据,然后修改
@blueprints1.route('/updateuser/')
def update_user():
# 先找到修改的对象(数据)
user = User.query.first() # 查询第一条数据
user.name = 'ikun'
db.session.commit()
return 'success!'
查:查询数据
查询数据
过滤器
filter() 把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上,返回一个新查询
limit() 使用指定的值限制原查询返回的结果数量,返回一个新查询
offset() 偏移原查询返回的结果,返回一个新查询
order_by() 根据指定条件对原查询结果进行排序,返回一个新查询
group_by() 根据指定条件对原查询结果进行分组,返回一个新查询
常用查询
all() 以列表形式返回查询的所有结果,返回列表
first() 返回查询的第一个结果,如果没有结果,则返回None
first_or_404() 返回查询的第一个结果,如果没有结果,则终止请求,返回404错误响应
get() 返回指定主键对应的行,如果没有对应的行,则返回None
get_or_404() 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应
count() 返回查询结果的数量
paginate() 返回一个Paginate 对象,它包含指定范围内的结果
查询属性
contains
startswith
endswith
in_
__gt__
__ge__
__lt__
__le__
逻辑运算
与 and_
filter( and_(条件),条件...)
或or_
filter(or_(条件),条件...)
非not_
filter(not_(条件),条件...)
# 查:查询数据
# 条件
@blueprints1.route('/selectuser/')
def select_user():
#########################################################################################################################################
# all():返回所有数据,列表的形式
users = User.query.all()
print(users, type(users))
# [<User ikun>, <User kunkun1>, <User kunkun2>, <User kunkun3>, <User kunkun4>, <User kunkun5>, <User kunkun6>, <User kunkun7>, <User kunkun8>, <User kunkun9>] <class 'list'>
print(User.query, type(User.query))
# SELECT tb_user.id AS tb_user_id, tb_user.name AS tb_user_name FROM tb_user <class 'flask_sqlalchemy.query.Query'>
#########################################################################################################################################
# filter():过滤,得到查询集,类似SQL中的where
users1 = User.query.filter()
print(users1, type(users1))
# SELECT tb_user.id AS tb_user_id, tb_user.name AS tb_user_name FROM tb_user <class 'flask_sqlalchemy.query.Query'>
print(list(users1)) # 可以用list强制转换
# [<User ikun>, <User kunkun1>, <User kunkun2>, <User kunkun3>, <User kunkun4>, <User kunkun5>, <User kunkun6>, <User kunkun7>, <User kunkun8>, <User kunkun9>]
'''
all 和 filter的区别
all 查询完之后就是一个列表,不能继续查询
filter 查询完后是以一个查询集 Query 它还能继续去查询
这个和django中的orm是一样的只要还是query_set就能继续查询
'''
#########################################################################################################################################
# get():得到对应主键值的数据对象
users2 = User.query.get(8)
print(users2, type(users2)) # 可以直接得到一个数据对象,也就是对应的一行数据
# <User kunkun6> <class 'App.models.User'>
print(users2.name) # 使用对象点属性的方式获取值
#########################################################################################################################################
# filter 和 filter_by
# filter: 类似于SQL中的where
# filter_by: 用于等值操作的过滤,但是要进行大于,小于,等的非等值操作不能进行,非等值操作只能用filter
users3 = User.query.filter(User.name == 'ikun')
# users3 = User.query.filter(User.age > 20)
print(users3, type(users3))
# SELECT tb_user.id AS tb_user_id, tb_user.name AS tb_user_name FROM tb_user WHERE tb_user.name = ? <class 'flask_sqlalchemy.query.Query'>
print(list(users3)) # 因为filter查询到的是一个查询集,所以我们需要list强制转换一下
# [<User ikun>]
users4 = User.query.filter_by(name='ikun')
print(users4, type(users4)) # 同样拿到的也是查询集
# SELECT tb_user.id AS tb_user_id, tb_user.name AS tb_user_name FROM tb_user WHERE tb_user.name = ? <class 'flask_sqlalchemy.query.Query'>
print(list(users4))
#########################################################################################################################################
# first():第一条数据
# first_or_404():第一条数据,如果不存在则抛出404错误
users5 = User.query.first() # 因为是获取一条数据,所以直接得到数据对象
users6 = User.query.first_or_404()
print(users6) # <User ikun>
#########################################################################################################################################
# count():统计查询集中的数据条数
# 前提是查询集才可以进行统计
users7 = User.query.filter().count()
print(users7) # 10
#########################################################################################################################################
# limit():取前几条数据
# offset():跳过前几条数据
'''
一般用于分页器
'''
users8 = User.query.offset(3).limit(4) # 跳过前3条数据,从第4条开始取,取前4条数据
print(list(users8))
# [<User kunkun3>, <User kunkun4>, <User kunkun5>, <User kunkun6>]
#########################################################################################################################################
# order_by():排序
users9 = User.query.order_by('id') # 默认升序
print(list(users9))
from sqlalchemy import desc
users10 = User.query.order_by(desc('id')) # 降序 需要导入desc包
print(list(users10))
#########################################################################################################################################
# 逻辑运算:and_,or_,not_
users11 = User.query.filter(User.age > 20, User.age < 25) # 默认是和操作
from sqlalchemy import and_, or_, not_
# users11 = User.query.filter(and_(User.age > 20, User.age < 25)) # 默认是和操作,但是需要导包,需要同时满足所有条件
users12 = User.query.filter(or_(User.age < 20, User.age > 25)) # 或 只要满足任何一个条件就可以取到
users13 = User.query.filter(not_(or_(User.age < 20, User.age > 25))) # 取反,取不满足条件的,这里会获取20-25之间的数据
#########################################################################################################################################
# 查询属性
# contaions():模糊查找,类似SQL中的like
users14 = User.query.filter(User.name.contaions('k')) # 类似于SQL中的like 只要带这个值的记录都会被查询出来,返回一个查询集
print(list(users14))
# in_():其中之一
users15 = User.query.filter(User.age.in_([10, 20, 30, 40])) # 只要是等于列表中的任何一个就会查出,返回一个查询集
# startswith():以xx开头
# endswith():以xx结尾
users16 = User.query.filter(User.name.startswith('i'))
users17 = User.query.filter(User.name.endswith('n'))
# __gt_:大于
users18 = User.query.filter(User.age._gt_(25))
print(list(users18))
#########################################################################################################################################
return 'sucess!'