flask的进阶使用方法

【 一 】一对多关系

# 1 一对一   [本质就是一对多--》多的那个唯一]
# 2 一对多
# 3 多对多

1.1 关系

####  一对多关系
class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')
    def __str__(self):
        return self.caption


class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名
    hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 一个爱好,可以被多个人喜欢,一个人只能喜欢一个爱好

    # 跟数据库无关,不会新增字段,只用于快速链表操作
    # 类名,backref用于反向查询
    hobby = relationship('Hobby', backref='pers')
    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name
from models import Person,Hobby
# 第一步:创建engine
from sqlalchemy import create_engine
engine = create_engine(
    "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy001?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 第二步:创建 session对象---老方式
from sqlalchemy.orm import Session
session=Session(engine)


if __name__ == '__main__':
    ### 笨办法增加
    #1 先增加一个hobby
    # hobby=Hobby()
    # session.add(hobby)
    # session.commit()
    #2 增加Person---》必须要有hobby_id
    # person=Person(name='lqz',hobby_id=1)
    # session.add(person)
    # session.commit()

    ### 简便方法--》增加person的同时,增加了Hobby
    # person = Person(name='lqz', hobby=Hobby(caption='乒乓球'))
    # session.add(person)
    # session.commit()
    # hobby=session.query(Hobby).filter_by(id=1).first()
    # person = Person(name='lqz3', hobby=hobby)
    # session.add(person)
    # session.commit()


    # 基于对象的跨表查询--->正向
    # person=session.query(Person).filter_by(nid=2).first()
    # print(person)
    # print(person.hobby_id)
    # print(person.hobby)

    # 基于对象的跨表查询--->反向
    hobby = session.query(Hobby).filter_by(id=1).first()
    print(hobby.caption)
    print(hobby.pers)






models.py

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
import datetime

# 新版本创建基类
# 第一步:创建基类,以后所有类,都必须继承基类
from sqlalchemy.orm import DeclarativeBase, relationship


class Base(DeclarativeBase):
    pass


### 第二步:写个类,继承
### 第三步:写字段:传统方式,类型方式

class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True, autoincrement=True)
    # name列varchar32,索引,不可为空 nullable=False
    name = Column(String(32), index=True, nullable=False)
    # email 列,varchar32,唯一
    email = Column(String(32), unique=True)
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)

    def __repr__(self):
        return f"<User(name={self.name}, email={self.email})>"


####  一对多关系
class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')

    def __str__(self):
        return self.caption


class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名
    hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 一个爱好,可以被多个人喜欢,一个人只能喜欢一个爱好

    # 跟数据库无关,不会新增字段,只用于快速链表操作
    # 类名,backref用于反向查询
    hobby = relationship('Hobby', backref='pers')

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name


if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine(
        "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    # 第四步 创建user表
    Base.metadata.create_all(engine)

    ## 第五步:删除表
    # Base.metadata.drop_all(engine)

from models import Person, Hobby

# 第一步:创建engine
from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 第二步 创建 session对象---老方式
from sqlalchemy.orm import Session

session = Session(engine)

# # 增加一个hobby
res1 = Hobby(caption='rapper')
session.add(res1)

# # person ---->>> 必须要有hobby_id
person = Person(name='jingyi', hobby_id=1)
session.add(person)
session.commit()
session.close()



## 简便方法--》增加person的同时,增加了Hobby
person = Person(name='jingyi', hobby=Hobby(caption='乒乓球'))
session.add(person)
session.commit()
hobby=session.query(Hobby).filter_by(id=1).first()
person = Person(name='jing', hobby=hobby)
session.add(person)
session.commit()


# 基于对象的跨表查询--->正向
person = session.query(Person).filter_by(nid=1).first()
print(person)
print(person.hobby_id)
print(person.hobby)

# 基于对象的跨表查询--->反向
hobby = session.query(Hobby).filter_by(id=1).first()
print(hobby.caption)
print(hobby.pers)

  • 基于对象的跨表查询—>正向

image-20240618172833794

  • 基于对象的跨表查询—>反向

image-20240618173136759

【 二 】多对多关系

  • modelss.py

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index, Table
import datetime

# 新版本创建基类
# 第一步:创建基类,以后所有类,都必须继承基类
from sqlalchemy.orm import DeclarativeBase, relationship


class Base(DeclarativeBase):
    pass


### 第二步:写个类,继承
### 第三步:写字段:传统方式,类型方式


# 定义关联表 多对多必备可少的参数
association_table = Table('user1_group_association', Base.metadata,
                          Column('user1_id', Integer, ForeignKey('user1.id')),
                          Column('group_id', Integer, ForeignKey('group.id')),
                          UniqueConstraint('user1_id', 'group_id')  # 如果需要的话,可以添加唯一约束
                          )


# 定义 User1 模型
class User1(Base):
    __tablename__ = 'user1'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)
    groups = relationship("Group", secondary=association_table, backref="users")


# 定义 Group 模型
class Group(Base):
    __tablename__ = 'group'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)



if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine(
        "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    # 第四步 创建user表
    Base.metadata.create_all(engine)

    ## 第五步:删除表
    # Base.metadata.drop_all(engine)

  • py

  • 增加

from modelss import User1, Group

# 第一步:创建engine
from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 第二步 创建 session对象---老方式
from sqlalchemy.orm import Session

session = Session(engine)
# # 增加一个group
group1 = Group(name='5A风景区')
group2 = Group(name='大清败家子慈溪')

# session.add_all([group1, group2])
# # 增加一个User1
res1 = User1(name='刘亦菲')
res2 = User1(name='赵敏')


res1.groups.append(group1)
res2.groups.append(group2)
session.add_all([res1,res2])


# 基于对象的跨表查--》正向

user = session.query(User1).filter(User1.id == 3).all()[0]
print(user.name)
print(user.groups)

session.commit()
session.close()

image-20240618190135414

# 基于对象的跨表查--》正向

user = session.query(User1).filter(User1.id == 2).all()[0]
print(user.name)
print(user.groups)



group = session.query(Group).filter(Group.id == 3).all()[0]
print(group.name)
print(group.users)
  • # 基于对象的跨表查–》正向

image-20240618191810231

  • 如果user1表中的字段没有关系可以

user1 = session.query(User1).filter_by(id=2).first()
if user1 is None:
    print("用户不存在")
else:
    # 假设你想要关联一个已经存在的组,其id为group_id
    group_id = 2 # 这里替换为你想要关联的组的ID

    # 查询该组
    group_to_add = session.query(Group).filter_by(id=group_id).first()
    if group_to_add is None:
        print("组不存在")
    else:
        # 将组添加到用户的groups列表中
        user1.groups.append(group_to_add)

        # 提交事务以保存更改
        session.commit()

        print("关联已添加")

        # 关闭session
    session.close()

image-20240618191320318

filter[where]查询 写条件

# #filter[where]查询  写条件
user1 = session.query(User1).where(User1.id >= 2)
# SELECT user1.id AS user1_id, user1.name AS user1_name
# FROM user1
# WHERE user1.id >= %(id_1)s
user2 = session.query(User1).where(User1.id >= 2).all()
#filter[where]查询  写条件
user3 = session.query(User1).filter(User1.id >= 2).all()
# [小昭, 刘亦菲, 赵敏, 小玲, 小妹]
group1 = session.query(Group).filter_by(name='5A风景区').first()
# 5A风景区
print(user1)
print(user2)
print(user3)
print(group1)

image-20240618193530312

between

## 3 between

res = session.query(User1).where(User1.id.between(1,7),User1.name == '刘亦菲').all()

print(res)
# 这个就代表有两个复合条件
# [刘亦菲, 刘亦菲]

image-20240618193929854

in

## 4 in
res = session.query(User1).filter(User1.id.in_([1,2,7])).all()
print(res)
# [李保平, 小昭, 刘亦菲]

image-20240618194126190

~非,除。。外

# 5 ~非,除。。外
res = session.query(User1).filter(~User1.id.in_([3, 4]),User1.name=='刘亦菲').all()
print(res)
# 原本是有两个刘亦菲的因为我用了~User1.id.in_([3, 4] 中的3 就是一个刘亦菲
# [刘亦菲]

二次筛选

session.query(User1).filter(User1.id.in_(session.query(Group.id).filter_by(name='刘亦菲'))).all()

and,or条件

# 7 and,or条件
from sqlalchemy import and_, or_
# and_
res1 = session.query(User1).filter(and_(User1.id > 1, User1.name == '刘亦菲')).all()
# or_
res2 = session.query(User1).filter(or_(User1.id >= 3, User1.name == '刘亦菲')).all()
print(res1)
# [刘亦菲, 刘亦菲, 刘亦菲]
print(res2)
# [刘亦菲, 刘亦菲, 刘亦菲, 小妹, 小玲, 赵敏]

通配符,以小开头,不以小开头

# 8 通配符,以小开头,不以小开头
res1 = session.query(User1).filter(User1.name.like('小%')).all()

res2 = session.query(User1).filter(~User1.name.like('小%')).all()

res3 = session.query(User1).filter(~User1.name.like('小%'))
print(res1)
# [小妹, 小昭, 小玲]
print(res2)
# [刘亦菲, 刘亦菲, 刘亦菲, 赵保平, 赵敏]
print(res3) # 原声sql语句
# SELECT user1.id AS user1_id, user1.name AS user1_name 
# FROM user1 
# WHERE user1.name NOT LIKE %(name_1)s

限制,用于分页,区间

# 9 限制,用于分页,区间
res1 = session.query(User1)[5:9]
res2 = session.query(User1)[0:4]
print(res1)
# [小玲, 赵保平, 赵敏]
print(res2)
# [刘亦菲, 刘亦菲, 刘亦菲, 小妹]

排序

# 10 排序,根据name降序排列(从大到小) desc   asc
res = session.query(User1).order_by(User1.name.asc()).all()
print(res)
# [刘亦菲, 刘亦菲, 刘亦菲, 小妹, 小昭, 小玲, 赵保平, 赵敏]

res = session.query(User1).order_by(User1.name.desc(), User1.id.asc()).all()
print(res)
# [赵敏, 赵保平, 小玲, 小昭, 小妹, 刘亦菲, 刘亦菲, 刘亦菲]

分组

# 12 分组      一旦分组后,select 字段必须是 分组字段或聚合函数的字段

from sqlalchemy.sql import func

ret = session.query(
    # 按 User1.name 分组,并选择每个组的最大 ID、ID 总和、最小 ID 和名称
    func.max(User1.id).label('max_id'),
    func.sum(User1.id).label('sum_id'),
    func.min(User1.id).label('min_id'),
    User1.name
).group_by(User1.name).all()

user1 = session.query(User1).filter(User1.name)
print(user1)
# SELECT user1.id AS user1_id, user1.name AS user1_name
# FROM user1
# WHERE user1.name
# 输出结果
for row in ret:
    print(row.max_id, row.sum_id, row.min_id, row.name)

image-20240618204150063

连表查询

# 连表查询

ret = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id).all()
print(ret)

ret1 = session.query(Person).join(Hobby, Person.nid == Hobby.id, isouter=True)
print(ret1)
# SELECT person.nid AS person_nid, person.name AS person_name, person.hobby_id AS person_hobby_id
# FROM person LEFT OUTER JOIN hobby ON person.nid = hobby.id

image-20240618204059136

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/773234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中一周的时间选择多个阶段(手动表格选择)

先给大家看一下效果图 源代码 <template><div style"width: 45%"><div style"width: 100%"><div class"time"><div class"timeleft">星期/时间</div><div class"timeright"><…

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 预警&#xff1a;今天文章的描述可能会让你有点别扭&#xff1b;如感到不适&#xff0c;请及时停止 在我行…

macos下搭建minikube dashboard的启动

背景 最近在复习一下k8s环境相关的知识&#xff0c;需要在自己电脑上搭建一个minikube的环境供自己使用。但是因为docker的镜像仓库最近被墙了&#xff0c;因此在执行minikube dashboard的时候&#xff0c;拉不到相应的镜像&#xff0c;就导致页面看不到相应的一些信息因此本文…

如何用手机拍出高级感黑白色调照片?华为Pura70系列XMAGE演绎黑白艺术

在影像的世界里&#xff0c;色彩可以让画面更丰富&#xff0c;更具有表现力&#xff0c;往往也能带来更多的视觉冲击。但有时候&#xff0c;黑白却有着一种独特的魅力。华为Pura 70系列XMAGE黑白风格&#xff0c;则给我们了一把通过纯粹艺术大门的钥匙。 XMAGE黑白并非简单的色…

2024 年第十四届 APMCM 亚太地区大学生数学建模A题 飞行器外形的优化问题--完整思路代码分享(仅供学习)

飞行器是在大气层内或大气层外空间飞行的器。飞行器可以分为:航空器航天器、火箭和导弹。在大气层内飞行的称为航空器&#xff0c;如气球、飞艇、飞机等。它们靠空气的静浮力或空气相对运动产生的空气动力升空飞行。在太空飞行的称为航天器&#xff0c;如人造地球卫星、载人飞船…

05-《猪笼草》

猪笼草 猪笼草是猪笼草属全体物种的总称。属于热带食虫植物&#xff0c;原产地主要为旧大陆热带地区。其拥有一个独特的吸取营养的器官——捕虫笼&#xff0c;捕虫笼呈圆筒形&#xff0c;下半部稍膨大&#xff0c;笼口上具有盖子&#xff0c;因其形状像猪笼而得名。 猪笼草 形…

开源协作wiki和文档软件Docmost

什么是 Docmost &#xff1f; Docmost 是一款开源协作 wiki 和文档软件。它是 Confluence 和 Notion 等软件的开源替代品。使用 Docmost 可以无缝创建、协作和共享知识。非常适合管理您的 wiki、知识库、文档等。目前 Docmost 处于测试阶段。 软件的主要特点 安装 在群晖上以 …

从OpenAI停服看中国市场:国产替代崛起的机遇与挑战

一、OpenAI 停服事件背景 OpenAI 自 2020 年推出 GPT-3 以来&#xff0c;在全球范围内引起了极大的反响。其强大的自然语言处理能力使其成为许多企业和开发者的首选工具。然而&#xff0c;2024 年 6 月 25 日&#xff0c;许多中国用户收到了一封来自 OpenAI 的邮件&#xff0c…

《地平线开发板小技巧》-- 备份与恢复SD卡镜像

在我们的机器人系统开发过程中&#xff0c;需要提前安装配置操作系统和依赖项&#xff0c;将这些依赖全部安装完成后&#xff0c;将系统镜像备份。在之后的系统安装中只要将备份好的镜像烧录进开发板中&#xff0c;岂不快哉~ 下面讲的便是地地平线开发板中镜像备份与恢复过程 …

人脸识别考勤系统

人脸识别考勤系统是一种利用生物识别技术进行自动身份验证的现代解决方案&#xff0c;它通过分析和比对人脸特征来进行员工的出勤记录。这种系统不仅提升了工作效率&#xff0c;还大大减少了人为错误和欺诈行为的可能性。 一、工作原理 人脸识别考勤系统的核心在于其生物识别…

Vue3进度条nprogress(手机端、PC端通用)

Vue3进度条nprogress是一个用于显示页面加载进度的库。要在Vue3项目中使用nprogress&#xff0c;需要先安装它&#xff0c;然后在你的项目中引入和使用。 安装nprogress npm install nprogress --save配置nprogress 在目录src下创建nprogress文件夹&#xff0c;里面创建nprogr…

Python面试宝典第6题:有效的括号

题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串&#xff0c;判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意&#xff1a;空字符…

九浅一深Jemalloc5.3.0 -- ⑨浅*gc

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

拆解COLA框架

COLA 是 Clean Object-Oriented and Layered Architecture的缩写&#xff0c;代表“整洁面向对象分层架构”。由阿里大佬张建飞所提出的一种基于DDD和代码整洁理论所诞生的实践理论框架&#xff0c;详细内容可阅读《程序员的底层思维》和相关git代码去了解 项目地址&#xff1a…

在地图上根据经纬度,画一个矩型围栏,设置每个点的经纬度

在做一个需求时有一个小点就是添加一个配送区域(5公里直径内的)矩形围栏 我做的比较简单 大家看看有没有帮助, 也是精简代码。测试效果上相对是精准的 //谷歌&#xff0c;根据经纬度获取以它为中心半径为5公里内的矩形的四个点经纬度getDefalutPoints (lng: number, lat: num…

lt6911UXC 国产原装 高性能HDMI2.0转MIPI DSI / CSI芯片方案 提供LT 开发资料包及在线软硬件技术支持!

1.说明 LT6911UXC是一款高性能HDMI2.0到MIPI DSI / CSI转换器&#xff0c;用于VR&#xff0c;智能电话&#xff0c;显示应用。 HDMI2.0输入支持高达6Gbps的数据速率&#xff0c;从而为4k 60Hz视频提供足够的带宽。还支持HDCP2.2进行数据解密。 对于MIPI DSI / CSI输出&#xf…

企业数据API平台:获取企业多维度信息

数据API平台是指提供一系列预先定义的接口、协议与工具&#xff0c;允许不同应用程序或系统之间进行数据交换和通信的平台。这些接口被称为数据API&#xff08;Data Application Programming Interface&#xff09;&#xff0c;是数据管理系统或应用程序提供的一组开放式接口。…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包&#xff0c;解压命令 tar -zxvf /install…

【博客21】缤果Qt5仿小米耳机APP布局_PC端软件(高级篇)

小米耳机 备注&#xff1a;此软件只是简单的实现布局和界面跳转逻辑, 并未加入小米协议相关内容,因需要鉴权方式验证,故无法进行通讯编程. 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) Android反编译工具: apktool 小米小爱开放平台 - 语音服务平台 - 文档中…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里