这几年一直在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表中查询
以下语句使用时,需加.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用于简单的查询列名,不支持比较运算符
User.query.filter_by(name='test').first()
默认是升序
query.order_by(-Users.id) # 降序
比如User用户表与Role角色表,用户可以外键关联一个角色,那么通过角色进行分组那么就是
User.query.group_by(User.role_id).all()
query.limit(1)
query.limit(1).offset(2)
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'
默认的查询方式都是讲所有表的行都作为结果查询,那么数据量很大,其次无法高效利用索引
所以我们使用load_only来采用查询特定字段作为结果
from sqlalchemy.orm import load_only
User.query.options(load_only(User.name, User.age)).all()
或者采用原生语法查询时定义查询结果
db.session.query(User.id).filter()
这是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进行同步,直接进行delete
或update
操作,如果被删除的在session中存在,那么在session commit或者expire_all之前,这些被删除的对象都会存在session中'fetch'
: 在delete
或update
操作之前,先发一条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")