Flask-5、query对数据库中数据的增删改查

查询时因为没有表,所以我先创建了表,有表的可直接查询。。。

一、模型类的创建:
# __init__.py

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, nullable=False, autoincrement=True, primary_key=True)
    username = db.Column(db.String(15), nullable=False)
    password = db.Column(db.String(128), nullable=False)
    phone = db.Column(db.String(15), nullable=True, unique=True)
    create_at = db.Column(db.DateTime, default=datetime.now)
    is_delete = db.Column(db.Boolean, default=False)

需要在app.py文件中引用User
然后在命令行执行命令:

1、python app.py db init
2、python app.py db migrate
3、python app.py db upgrade

数据库中生成表的部分字段的展示

idusernamepasswordcreate_at
1abcxxxxxx
2yyyxxxxxx
3abcxxxxxx


下面我们开始查询数据库的数据: (新版本的pycharm不提示query)

二、模型类.query的查询
首先导入:
 	from sqlalchemy import or_,and_.not_
	from xx import User # User是一个创建user表的类
1、根据主键查询用户使用get(主键值),返回值是一个对象
user = User.query.get(1)
#  select * from user where id = 1 
2、取所有
# all()或者是first()/last(),不加的话,user返回的是一个select语句
user_all = User.query.filter().all()  # all返回的是列表,列表里面是对象(需要循环),  [<User obj1>]、[<User obj2>], filter中也可以不加条件
# select * from user where xx

user_all = User.query.all()  # 或者这样,也是取所有,上面是根据条件取所有
# select * from user
3、取第一条,filter括号中可以加条件 (==) 或者is_
user_first = User.query.filter(User.username == 'abc').first()  # first返回的是对象(因为就一个)
# select * from user where username='abc' limit 1
4、以xx开头或结尾 startswith、endswith
user_list_swith = User.username.filter(User.username.startswith('a')).all  
# select * from user where like 'a%' 找到名字以'a'开头的所有用户
5、或条件 or_
user_list_or_ = User.query.filter(or_(User.username.like("w%"), User.username.contains("a"))).all()
# select * from user where username like "w%" or username like "%a%"
6、与条件 and_
user_list_and_ = User.query.filter(and_(User.username.contains("z%"),
									 User.create_at.__eq__('2021-10-23 23:49:09')
									 )
								).all() 
# 把__eq__ 换成 =,也是可以的
# select * from user where username like "%z%" and create_at = "2021-10-23 23:49:09"
7、非条件 not_
user_list_not_ = User.query.filter(not_(User.username.contains('w'))).all()
# select * from user where username not like '%w%'  否定条件
8、in条件 in_
user_list_in_ = User.query.filter(User.phone.in_(['123456789','8767465327'],)).all()
# select * from user where phone in ('123456789','8767465327')
9、排序 order_by
user_list_order = User.query.order_by(User.id).all()  
# 根据字段排序 加-User.id 是降序
# select * from user order by id 

user_list_order_by = User.query.filter(not_(User.username.contains('c'))).order_by(-User.create_at).all()
# select * from user 
# where username not like '%c%' 
# order by create_at desc
10、limit 限制
user_list_limit = User.query.limit(2).all()
# select * from user limit 2
user_list__offset_limit = User.query.offset(2).limit(2).all() # 跳过两条,再取两条
# select * from user limit 2,2
11、查询某一字段
# select id, name from user;
user_res = db.session.query(User.id, User.name).all()
或
user_res = User.query.with_entities(User.id, User.name).all()

# distinct 去重
user_res = User.query.with_entities(User.name).distinct().all()
三、添加数据到数据库 add:

db.session.add()

us1 = User(name='wang',email='wang@163.com',pswd='123456',role_id=ro1.id)

db.session.add(us1) # 添加一条
# 已经存在的不用写add(改/删),新增加的数据需要add

# 添加多条
db.session.add_all([us1,us2,us3,us4]) 

# 提交数据
db.session.commit()
四、删除数据 delete

两种删除:物理删除和逻辑删除

  1. 物理删除
user_id = request.args.get('id')
user = User.query.get(user_id)  # 根据id找到这个用户对象
db.session.delete(user)  # 删除
db.session.commit()  # 提交
  1. 逻辑删除:数据库信息还存在,判断某个字段,只是在前端显示的是删除
user_id = request.args.get('id') # 取到用户id

user = User.query.filter(User.id == user_id).first()  
# 或者 User.query.get(user_id) 根据id找到这个用户对象

# is_delete为True表示删除
user.is_delete = True 

db.session.commit()
三、重点总结内容:

(1).一般查询:
  User.query.filter() # 按条件查询 (主要的)

  1、User.query.filter().all()  # 所有
  2、User.query.get()     # 获取一个,根据主键。
  3、User.query.filter().first()  # 第一个
  4、User.query.filter(User.username.startswith(‘’)).all()   # 按xx开头查询
  5、User.query.filter(User.username.endswith(‘’))   # 按xx结尾查询
  6、User.query.filter(User.username.like(‘xx%’))    # 按xx%查询
  7、User.query.filter(User.username.contains(‘xx’))   # 含有xx内容的查询
  8、User.query.filter(User.username.in_([‘A’,‘B’,‘C’]))   # 查询有A、B、C内容
  9、User.query.filter(User.username == ‘A’)   # 查询等于A

(2).如果要检索的字段是-> 整形/日期类型/范围:
  User.age._lt_(18)
  User.create_at._gt_(‘2021-10-10’)
  User.age.between(15,30)
  有这么多:_lt_、_le_、_gt_、_ge_、_eq_、contains、like. # 当然也可以用 >,<, >=, <=,!= 更方便

(3).多个条件一起检索:and_ ,or_

(4).非得条件:not_

(5).排序内容:
  User.query.order_by(User.id).all()

  User.query.filter(User.create_at > ‘xx’)order_by(User.create_at).all()
    # 先筛选日期大于xx,然后在升序排列

  User.query.filter(User.create_at > ‘xx’)order_by(-User.create_at).all()
    # 先筛选日期大于xx,然后在降序排列

注意:order_by(参数)
    1.直接是字符串: ‘字段名’ 但是不能倒序
    2.填写字段名: 模型.字段 order_by(-模型.字段) 倒序
    offset(2).limit(2).all offset先偏移2个,然后再取2条记录,从3开始,到4结束

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值