Flask-SQLAlchemy增删改查详解、字段索引关系

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

增删改查

增加数据
object = Users(name="test1", age="16")
db.session.add(object)
db.session.commit()   

添加多条

user2 = User(name="admin", age="17")
user3 = User(name="root", age="18")
db.session.add(user2)
db.session.add(user3)
db.session.commit()
user_list = [
  	User(name="admin1", age="19"),
  	User(name="admin2", age="20"),
]
db.session.add_all(user_list)
db.session.commit()
查询数据
全部查询
Users.query.all()

select * from users;

查询user表中的所有数据

数量查询
Users.query.count()
Users.query.filter(...).count()
首个查询
Users.query.first()
User.query.filter_by(...).first()
first_or_404() # 返回查询的第一个结果,如果未查到,返回404
通过主键查询
Users.query.get(1)
get_or_404() # 返回指定主键对应的行,如不存在,返回404

select * from users where users.id= %(param_1)s;

通过id在users表中查询

filter过滤

以下语句使用时,需加.all()等方法实获取数据,否则只是一条创建好的SQL语句

EQUALS

query.filter(User.id==1)

NOT EQUALS

query.filter(User.id!=1)

LIKE

query.filter(User.name.like('%test%'))

IN

query.filter(User.id.in_([1, 2, 3]))

NOT IN

query.filter(~User.id.in_([1, 2, 3]))

IS NULL

query.filter(User.name == None)
query.filter(User.name.is_(None))

IS NOT NULL

query.filter(User.name != None)
query.filter(User.name.isnot(None))

AND

query.filter(and_(User.name=='test', User.age == '17'))

OR

query.filter(or_(User.id==1, User.id==2))

MATCH AGAINST

使用全文索引FULLTEXT INDEX进行查询

query.filter(Users.name.match("te"))

OFFSET LIMIT

跳过前两条拿取,只拿三条

query.filter(Users.name.match("te")).offset(2).limit(3)
filter_by过滤

filter_by用于简单的查询列名,不支持比较运算符

User.query.filter_by(name='test').first()
order_by排序

默认是升序

query.order_by(-Users.id) # 降序
group_by分组

比如User用户表与Role角色表,用户可以外键关联一个角色,那么通过角色进行分组那么就是

User.query.group_by(User.role_id).all()
limit限制
query.limit(1)
query.limit(1).offset(2)
paginate分页查询
def paginate(self, page=None, per_page=None, error_out=True, max_per_page=None):
   	'''
    page: 第几页
    per_page: 一页几条
    '''

比如分页一个表中的数据

paginate = History.query.paginate(5, 3)
# 第五页,每页三条

分页对象paginate不光包含一页的数据,还包含其余属性

'items', 'iter_pages', 
'has_next', 'next', 'next_num', 
'page', 'pages', 'per_page', 
'has_prev', 'prev', 'prev_num', 
'query', 'total'
  • pages: 总共能生成多少页
  • page: 当前页码
  • has_next、has_prev: 是否有下、上一页
  • next_num、prev_num: 下、上一页页码
  • next、prev: 下、上一页的分页对象
  • items: 当前页数据
  • total: 记录总数
  • per_page: 每页显示的记录数量
查询优化

默认的查询方式都是讲所有表的行都作为结果查询,那么数据量很大,其次无法高效利用索引

所以我们使用load_only来采用查询特定字段作为结果

from sqlalchemy.orm import load_only
User.query.options(load_only(User.name, User.age)).all()

或者采用原生语法查询时定义查询结果

db.session.query(User.id).filter()
db.session查询

这是sqlAlchemy的原生语法

db.session.query(User).all()
db.session.query(User).first()
db.session.query(User).get(2)
更新数据

修改单一数据 先执行查,再执行修改

user = User.query.get(1)
user.name = "new"
db.session.commit()

批量修改

Users.query.filter_by(name='zxc').update({'name': 'aaabbb'})
db.session.commit()
db.session.query(Users).filter_by(name="bbb").update({"name": "zxc"})
db.session.commit()
删除数据

删除数据,也是要先获取,在删除哦

  • 批量删除
Users.query.filter_by(name='aaabbb').delete()
Users.query.filter(User.id.in_(1,2,3)).delete(synchronize_session=False)
db.session.commit()
  • 单独删除
object = Users.query.filter_by(name='test').first()
db.session.delete(object)
db.session.commit()
  • 全量删除

一整个表都没了

Users.query.delete()
批量更新或删除

sqlalchemy 利用 session 执行 delete 时有一个 synchronize_session 参数用来说明 session 删除对象时需要执行的策略,共三个选项

session.filter(Tag).delete(synchronize_session='evaluate')

synchronize_session用于query在进行批量的delete或者update操作时,对session的同步策略

  • False: 不对session进行同步,直接进行deleteupdate操作,如果被删除的在session中存在,那么在session commit或者expire_all之前,这些被删除的对象都会存在session中
  • 'fetch': 在deleteupdate操作之前,先发一条sql到数据库获取符合条件的记录,符合条件的将会从session中删掉或更新
  • 'evaluate': 默认值。如果 session 中原本就没有这些被删除的 objects,扫描不会发生匹配,相当于匹配未正确执行,抛出错误

表索引

主键索引
id = db.Column(db.Integer, primary_key=True)
普通索引
phone = db.Column(db.String(11), index=True)
唯一约束
phone = db.Column(db.String(11), unique=True)
联合唯一索引
idol = db.Column(db.Integer, db.ForeignKey("users.id")) # 偶像
fans = db.Column(db.Integer, db.ForeignKey("users.id")) # 粉丝
db.UniqueConstraint('idol','fans',name="follow_relation")

你可能感兴趣的:(Python学习,Flask,flask,python,后端,sqlalchemy)