当前位置: 首页 > news >正文

python sqlalchemy(ORM)- 02 表关系

文章目录

  • 表关系
  • ORM表示 1v1
  • ORM表示 1vm

表关系

  • 1:1,表A 中的一条记录,仅对应表B中的一条记录;表B的一条记录,仅对应表A的一条记录。
  • 1:m,表A中的一条记录,对应表B中的多条记录,表B中的一条记录,仅对应表A的中的一条;(多的一方创建外键)
  • m:n ,表A 中的一条记录,可对应表B中的多条记录;表B的一条记录,也可对应表A的多条记录。

 

ORM表示 1v1

pass

 

ORM表示 1vm

  • 表结构
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 创建模型类
from sqlalchemy import Column, Integer, Float, String, Enum, ForeignKey, VARCHAR
from sqlalchemy.dialects.mysql import VARCHAR
from sqlalchemy.orm import declarative_base, relationship, Session, sessionmaker # sessionmaker返回一个会话类
from sqlalchemy import create_engine

# base class
Base = declarative_base()


# Address
class Address(Base):
	__tablename__ = "address_t"
	id = Column(Integer, primary_key=True)
	# 地址字段, mysql数据库使用VARCHAR类型,其他使用String类型
	title = Column("address", String(50).with_variant(VARCHAR(50, charset="utf8"), "mysql"), nullable=False)
	# 外键
	user_id = Column(Integer, ForeignKey("user_t.id"), nullable=True)
	
	# 关系(非表字段),模型类之间的引用
	# back_populates 双向的 反向引用(通过属性)
	# cascade 级联动作 delete-orphan 表示子表断开引用主表时,删除记录,仅用于1:m 中1的一方
	user = relationship("User", back_populates="addresses")
	def __repr__(self): # 打印对象时的输出
		return f"{self.title}"

# User
class User(Base):
	__tablename__ = "user_t"
	id = Column(Integer, primary_key=True)
	name = Column(String(30), unique=True)
	fullname = Column(String(50))
	# 枚举
	sex = Column(Enum("male", "female", name="sex")) 
	age = Column(Integer)
	role_id = Column(Integer, ForeignKey("role_t.id"), nullable=True)
	
	# 关系
	addresses = relationship("Address", back_populates="user", cascade="all, delete-orphan")
	role = relationship("Role", back_populates="users")
	
	def __repr__(self):
		return f"{self.name}"


# Role
class Role(Base):
	__tablename__ = "role_t"
	id = Column(Integer, primary_key=True)
	name = Column(String(30), unique=True)

	# 关系
	users = relationship("User", back_populates="role")

	def __repr__(self):
		return f"{self.name!r}"


# 创建懒连接
sqlalchemy_database_uri = "postgresql://user:pw@ip:port/dbxx"
engine = create_engine(sqlalchemy_database_uri, echo=True)
# 删除所有的表
Base.metadata.drop_all(engine)
# 创建所有的表
Base.metadata.create_all(engine)
# 创建会话
with Session(engine) as session:
	 jack = User(name="jack", fullname="张三", sex="male", age=34, addresses=[Address(title="北京"), Address(title="河南")])
	 tom = User(name="tom", fullname="李四", sex="female", age=25, addresses=[Address(title="武汉")])
	# 创建角色 
    role = Role(name="老师", users=[jack, tom])
    # 仅仅添加一个****主表记录**** 即可,子表记录 连带添加
    session.add(role)
    session.commit() # 事务的最终提交

在这里插入图片描述
在这里插入图片描述
主表记录插入时,连带子表记录一起插入。

相关文章:

  • ESP32C3 LuatOS TM1650②动态显示累加整数
  • *#220807#你还记得么 国产手机*#220807#隐藏的功能
  • 【M365运维】给从本地同步到O365的DL添加 Send As权限
  • windows开机自启动和忘记密码-备忘
  • 【webpack】wabpack5 知识梳理
  • Linux使用wget下载文件时报错
  • 大数据之LibrA数据库常见术语(四)
  • Android 指定有线网或Wifi进行网络请求
  • RSA加密算法Python实现
  • 5G技术的飞速发展:连接未来
  • Centos7单节点快速安装fastdfs
  • MYSQL(事务+锁+MVCC+SQL执行流程)理解(2)
  • 智能巡检系统怎么用?如何让设备巡检维护更高效?
  • SpringBoot整合knife4j
  • Dockerfile
  • 编译无法加载主类的问题
  • 【前端】Layui小功能收集整理
  • Android Kotlin 协程初探 | 京东物流技术团队
  • 如何在不恢复出厂设置的情况下解锁 Android 手机密码?
  • JavaScript 原型链污染
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%
  • 中国空间站首批在轨繁育果蝇即将返回地球,有望获得多项科学成果
  • 打工人的“小长假模式”,已经迫不及待地开启了
  • 上海灵活就业人员公积金新政有哪些“创新点”?
  • 观察|英国航母再次部署印太,“高桅行动”也是“高危行动”
  • 中方会否公布铁线礁的领海基线?外交部:中方执法活动旨在反制菲方侵权挑衅