Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQLAlchemy学习-9.一对多和多对一关系

SQLAlchemy学习-9.一对多和多对一关系

作者头像
上海-悠悠
发布于 2022-08-26 07:55:18
发布于 2022-08-26 07:55:18
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

前言

一对多和多对一关系

一对多关系

一对多关系表设计,一个Parent类关联多个Child类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship

# 拼接配置dialect + driver://username:passwor@host:port/database
DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
Base = declarative_base()

class Parent(Base):  # 一
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False)
    full_name = Column(String(64))
    # 在父表类中通过 relationship() 方法来引用子表的类集合
    children = relationship("Child")

class Child(Base):  # 多
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False)
    full_name = Column(String(64))
    # 在子表类中通过 foreign key (外键)引用父表的参考字段
    parent_id = Column(Integer, ForeignKey('parent.id'))

if __name__ == '__main__':
    engine = create_engine(DB_URI)
    Base.metadata.create_all(engine)  # 将模型映射到数据库中

与一对一关系主要区别是relationship不用设置 uselist=False参数

同步后生成的表

新增数据

添加数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:123456@localhost:3306/web')
# 把当前的引擎绑定给这个会话
Session = sessionmaker(bind=engine)
# 实例化
session = Session()

# 添加数据
parent = Parent(name='yy', full_name='yoyo')
parent.children = [
    Child(name='c1', full_name='c1 full name')
]
session.add(parent)
session.commit()

# 如果parent 已经存在
parent = session.query(Parent).filter(Parent.name == 'yy')
children = [
    Child(name='c4', full_name='c4 full name', parent_id=parent.first().id),
    Child(name='c5', full_name='c5 full name', parent_id=parent.first().id),
]
session.add_all(children)
session.commit()

查询数据

通过父类,查询子类(单向查询)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    parent = session.query(Parent).get(1)
    print(parent.children)

多对一关系

多对一关系相比上面的一对多而言是双向的关系 在最新版本的 sqlalchemy 中对 relationship 引进了 back_populates 参数, 两个参数的效果完全一致。

backref 和 back_populates 两个参数的区别

  • backref 只需要在 Parent 类中声明 children,Child.parent 会被动态创建。
  • back_populates 必须在两个类中显式地使用 back_populates,更显繁琐,理解更直观
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
# 拼接配置dialect + driver://username:passwor@host:port/database
DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
Base = declarative_base()

class Parent(Base):  # 一
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False)
    full_name = Column(String(64))
    # 父类的 relationship() 方法中使用 relationship.back_populates 参数
    children = relationship("Child", back_populates="parent", lazy="dynamic")

class Child(Base):  # 多
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False)
    full_name = Column(String(64))
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", order_by='Parent.id', back_populates="children")
    # 子表类中附加一个 relationship() 方法

if __name__ == '__main__':
    engine = create_engine(DB_URI)
    Base.metadata.create_all(engine)  # 将模型映射到数据库中

查询数据(双向查询)

通过父类查询子类,或子类查询父类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine


engine = create_engine('mysql+pymysql://root:123456@localhost:3306/web')
# 把当前的引擎绑定给这个会话
Session = sessionmaker(bind=engine)
# 实例化
session = Session()

parent = session.query(Parent).get(1)

print(parent.children.all())
children = session.query(Child).get(1)
print(children.parent)

2022年第 11 期《python接口web自动化+测试开发》课程,6月5号开学

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SQLAlchemy学习-4.一对一关系
前言 表之间一对一关系 foreign key (外键) 父表类中通过 relationship() 方法来引用子表的类集合 在子表类中通过 foreign key (外键)引用父表类 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.orm import relati
上海-悠悠
2022/07/19
1.2K0
SQLAlchemy学习-4.一对一关系
SQLAlchemy学习-5.relationship之backref和back_populates参数
前言 relationship 函数是 sqlalchemy对关系之间提供的一种便利的调用方式, backref参数则对关系提供反向引用的声明。 在最新版本的sqlalchemy中对relationship引进了back_populates参数, 两个参数的效果完全一致。 backref 和 back_populates 两个参数的区别 backref 只需要在 Parent 类中声明 children,Child.parent 会被动态创建。 back_populates 必须在两个类中显式地使用 bac
上海-悠悠
2022/07/19
2.8K0
Python 数据库骚操作 -- MySQL
今天这篇是三大数据库的结尾篇,前面两篇分别是:《Python 数据库骚操作 -- MongoDB》《Python 数据库骚操作 -- Redis》,这篇主要介绍 MySQL 的 orm 库 SQLAlchemy 。那什么是 orm 呢?Object Relational Mapper,描述程序中对象和数据库中数据记录之间的映射关系的统称。介绍完了,那就走起呗!
1480
2019/08/05
5310
Python 数据库骚操作 -- MySQL
SQLAlchemy学习-7.Column 设置日期时间类型
前言 在表里面一般会设置创建时间和更新时间,创建时间是数据写入时候的时间,更新时间是表的数据有更新,自动获取当前时间。 onupdate 是在更新时执行该方法,一般用在更新时间字段上。 DateTime 日期时间 Column 字段设置 DateTime 日期时间类型 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String, Da
上海-悠悠
2022/07/19
4.4K0
SQLAlchemy学习-7.Column 设置日期时间类型
SQLAlchemy SQLAlchemy
SQLAlchemy 1.1.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装 pip install sqlalchemy 组成部分 Engine,框架的引擎 Connection Pooling ,数据库连接池 Dialect,选择连接数据库的DB API种类 Schema/Types,架构和类型 SQL Exprr
zhang_derek
2018/05/30
2.3K0
SQLAlchemy学习-1.环境准备与基础使用
前言 SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的企业级持久模型。 它提供了SQL工具包和ORM(对象关系映射)工具,类似于Django 自带的 ORM 框架操作数据库。 环境准备 基于python3.8环境,安装 sqlalchemy 和 pymysql pip3 install sqlalchemy==1.4.39 pip3 install pymysql==1.0.2 配置连接 连接数据库,需要使用到一些配置信息,组合成满足以下条件的字符串: dialec
上海-悠悠
2022/07/19
8330
SQLAlchemy学习-1.环境准备与基础使用
Flask-SQLAlchemy
一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 1 pip3 install sqlalchemy 组成部分: Engine,框架的引擎 Connection Pooling ,数据库连接池 Dialect,选择连接数据库的DB API种类 Schema/Types,架构和类型 SQL Ex
用户1214487
2018/01/24
5.5K0
Flask-SQLAlchemy
SQLAlchemy
SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
小小咸鱼YwY
2020/06/19
3.2K0
SQLAlchemy学习-2.query() 查询数据
前言 SQLAlchemy 使用 query() 方法查询数据 创建模型 接着前面一篇创建的模型 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String # 拼接配置dialect + driver://username:passwor@host:port/database DB_URI = 'mysql+pymysql://
上海-悠悠
2022/07/19
2.7K0
SQLALchemy的其他常用操作
使用连接池的两种方式 第一种方式: 直接从SessionFactory里获取,此时如果需要开启多个进程,那么创建连接池的代码一定要放在循环里面 不然的话每个进程都是用一个session了 from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from models import Student,Course,Student2Course engine = create_engine( "my
人生不如戏
2018/07/05
7870
Flask框架(五)之SQLAlchemy
SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
GH
2020/03/19
3K0
SQLAlchemy使用
SQLAlchemy是Python语言的一款流行的ORM(Object Relational Mapper)框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,即将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
职场亮哥
2020/10/10
8660
SqlAlchemy 2.0 中文文档(十一)
本节描述了relationship()函数及其用法的深入讨论。关于关系的介绍,请从使用 ORM 相关对象开始,参阅 SQLAlchemy 统一教程。
ApacheCN_飞龙
2024/06/26
2450
python数据库操作之sqlalchemy逆向工程
右键运行config.py,会在当前目录生成models.py模型文件如下,该文件最好不要改动,后面数据库表改动的话,直接重新生成就好。
全栈程序员站长
2022/06/28
4370
FastAPI 结合 SQLAlchemy 操作 MySQL 数据库
文章目录 1. 安装 SQLAlchemy 2. 创建数据库 3. SQLAlchemy 连接 MySQL 4. 创建数据模型 5. 创建 Pydantic 模型 6. crud 工具 7. main函数 learning from 《python web开发从入门到精通》 1. 安装 SQLAlchemy pip install sqlalchemy 2. 创建数据库 mysql -u root -p 命令行登录 MySQL 创建数据库 fastapi_db mysql> create database
Michael阿明
2022/01/07
6.3K1
FastAPI 结合 SQLAlchemy 操作 MySQL 数据库
Python 学习笔记 - SQLAlc
例1. 获取主机1的所有用户,原理和1对多的一样,通过relationship快速定位到对应的表
py3study
2020/01/15
3260
Python 学习笔记 - SQLAlc
ORM框架SQLAlchemy
原文链接:https://www.cnblogs.com/mengqingjian/articles/8521512.html
菲宇
2019/09/23
1.2K0
ORM框架SQLAlchemy
SQLAlchemy总结+
Review: 一、Mysql 操作 创建一个test库 create database test; 授权一个用户 grant all privileges on *.* to 'asd'@'%' identified by 'awerfsdf123'; 创建表 create table student(id int not null); 查询 select * from tabel_name where 条件1 and 条件2 增加 insert into table_name (id, name
老七Linux
2018/05/31
2.3K0
python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
  对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
用户1432189
2018/09/05
2.3K0
python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
Python 使用SQLAlchemy数据库模块
SQLAlchemy 是用Python编程语言开发的一个开源项目,它提供了SQL工具包和ORM对象关系映射工具,使用MIT许可证发行,SQLAlchemy 提供高效和高性能的数据库访问,实现了完整的企业级持久模型。
王瑞MVP
2023/11/24
4800
相关推荐
SQLAlchemy学习-4.一对一关系
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文