Flask 模型表操作 单表

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!'
posted @ 2023-07-03 15:22  春游去动物园  阅读(41)  评论(0编辑  收藏  举报