栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

day06 SQLAlchemy进阶

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day06 SQLAlchemy进阶

目录

1.单表数据查询操作

1.1 all(), first(), get()的使用

1.2 filter(), filter_by实现过滤操作

1.3 分页与排序

1.4 逻辑运算与聚合

2.关系查询与优化查询

2.1 一对多关系

2.2 多对多关系

3.Flask-SQLAlchemy执行自定义SQL语句


1.单表数据查询操作

1.1 all(), first(), get()的使用
# all():用户查询所有数据
User.query.all()

# first(): 用户查询第一条数据
User.query.first() 

# get(): 需要传递, 查询主键与参数相同的数据
User.query.get(1)

1.2 filter(), filter_by实现过滤操作

条件查询提供了filter()与filter_by来实现, filter_by可以看做是filter的简写方式.

# (1).filter()实现的条件查询
User.query.filter(User.username=='name').first()
# (2).filter_by()实现的条件查询
User.query.filter_by(username="name").first()

1.3 分页与排序
# 1.限制查询(分页)
User.query.filter(age=18).offset(2).limit(3)  # 跳过二条开始查询,限制输出3条
注意: offset与limit先后顺序调换, 不影响查询结果

# 2.排序
    # (1).按照年龄升序排序, 默认升序, 可以省略".asc()"
    User.query.order_by(User.age.asc()).all()
    # (2).按照年龄降序排序
	User.query.order_by(User.age.desc()).all() 

1.4 逻辑运算与聚合
# 1.逻辑运算
from sqlalchemy import or_, and_, not_
# (1).or_: 或, 查询名字为jeremy或年龄为19的
User.query.filter(or_(User.username =='jeremy',User.age==18)).all()
# (2).and_: 与, 查询名字为j2或年龄为19
User.query.filter(and_(User.name=="j2", User.age==19)).all()
# (3).not_: 非, 查询年龄不是18岁的
User.query.filter(not_(User.age==18)).all()

# 2.比较查询
User.query.filter(User.id.__lt__(5)) # 小于5
User.query.filter(User.id.__le__(5)) # 小于等于5
User.query.filter(User.id.__gt__(5)) # 大于5
User.query.filter(User.id.__ge__(5)) # 大于等于5

# 3.in查询 TODO in 操作
User.query.filter(User.username.in('A','B','C','D'))

# 4.聚合查询
from sqlalchemy import func
class Index(Resource):
    def get(self):
        ret1 = db.session.query(func.count(Stu.age)).all()
        ret2 = db.session.query(func.sum(Stu.age)).all()
        ret3 = db.session.query(func.avg(Stu.age)).all()
        print('统计数量: ', ret1[0][0])
        print('年龄总和:', ret2[0][0])
        print('年龄平均值:', ret3[0][0])
        return json.dumps({'msg': 'ok'})

2.关系查询与优化查询

2.1 一对多关系

        

# 1.一对多关系的建立: 一方建立关系, 多方建立外键
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

# 专业模型
class Sub(db.Model):
    __tablename__ = 'sub'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    # 一方定义关系, 关联Stu模型, Stu为类名, 不是表名哦; backref的值是给"多方"用来查询"一方"的
    stu = db.relationship('Stu', backref='stu')  

    def __repr__(self):
        return self.name

# 学生模型
class Stu(db.Model):
    __tablename__ = 'stu'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    age = db.Column(db.Integer)
    snum = db.Column(db.Integer, unique=True)
    # 多方定义外键, 关联sub.id
    sub_id = db.Column(db.Integer, db.ForeignKey('sub.id'))
    

    def __repr__(self):
        return self.name
# 2.一对多关系的查询:
从一查多:
    sub = Sub.query.get(1)
    stus = sub.stu.all()
    
从多差一:
    stu = Stu.query.get(2)
    sub = stu.stu  # stu.stu中的第2个stu为backref的值,返回的是sub对象

2.2 多对多关系

        多对多关系建立

                1. 先把两个需要做多对多的模型定义出来

                2. 使用Table定义一个中间表,中间表一般就是包含两个模型的外键字段就可以了,并且让他们两个来作为一个“复合主键”。

                3. 在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表模型名。 

        示例:

article_tag = db.Table(
    'article_tag',
    db.Column('article_id', db.Integer, db.ForeignKey("article.id"),primary_key=True),
    db.Column('tag_id', db.Integer, db.ForeignKey("tag.id"), primary_key=True)
)


# 文章表
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64))
    tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles'))

    def __repr__(self):
        return self.title

# 标签表
class Tag(db.Model):
    __tablename__ = 'tag'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    def __repr__(self):
        return self.name
# 多对多关系的查询
# 1.查询文章所有的标签:
article = Article.query.filter(Article.title="xxx").first()
tags = article.tags

# 2.查询一个标签涉及的所有文章:
tag = Tag.query.get(2)
print('标签: ', tag)
articles = tag.articles  # tag.articles中的articles是Article表中关系中backref的值
print('文章: ', articles)

3.Flask-SQLAlchemy执行自定义SQL语句
# 定义SQL语句
sql = 'select name from stu where id=3'
# 指定SQL语句
db.session.excute(sql)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870702.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号