SQLAlchemy学习-4.一对一关系
2022/7/17 2:15:17
本文主要是介绍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 relationship class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child", uselist=False, backref='detail') # 在父表类中通过 relationship() 方法来引用子表的类集合 class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) # 在子表类中通过 foreign key (外键)引用父表的参考字段
使用示例
ForeignKey 外键关联到父类id,父类名称用小写。
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship Base = declarative_base() class Card(Base): """银行卡基本信息""" __tablename__ = 'card' # 数据库表名 id = Column(Integer, primary_key=True, autoincrement=True) card_id = Column(String(30)) card_user = Column(String(10)) tel = Column(String(30)) card_detail = relationship("CardDetail", uselist=False, backref='detail') class CardDetail(Base): """银行卡 详情信息""" __tablename__ = 'carddetail' # 数据库表名 id = Column(Integer, primary_key=True, autoincrement=True) mail = Column(String(30)) city = Column(String(10)) address = Column(String(30)) card_id = Column(Integer, ForeignKey('card.id')) if __name__ == '__main__': DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web' engine = create_engine(DB_URI) Base.metadata.create_all(engine) # 将模型映射到数据库中
执行后生成2张表
创建数据
同时给主表和关联表添加数据
from xuexi.a4 import Card, CardDetail 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() card = Card(card_id='3211222001', card_user='yoyo', tel='10086') session.add(card) session.flush() # flush方法会生成Primary Key 得到card 的 id detail = CardDetail(mail='123@qq.com', city='上海市', address='徐汇区', card_id=card.id) session.add(detail) session.commit() # 提交
执行完成后,会在表中添加数据
查询数据
正向查询,通过主表对象,查询到副表
from xuexi.a4 import Card, CardDetail from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:123456@47.108.155.10:3306/web') # 把当前的引擎绑定给这个会话 Session = sessionmaker(bind=engine) # 实例化 session = Session() # 查询 # query() r1 = session.query(Card).filter(Card.card_user == 'yoyo').first() print(r1) # 正向查询,主表查副表 print(r1.card_detail) print(r1.card_detail.mail)
运行结果
<Card(id=1, card_id=3211222001, card_user=yoyo ...)> <CardDetail(id=1, mail=123@qq.com, city=上海市 ...)> 123@qq.com
反向查询,通过副表查询主表
# 先查关联表数据 r2 = session.query(CardDetail).filter(CardDetail.mail == '123@qq.com').first() print(r2) # 反向查询主表 print(r2.detail) # relationship 通过 backref='detail'属性 副表关联到主表 print(r2.detail.card_user)
运行结果
<CardDetail(id=1, mail=123@qq.com, city=上海市 ...)> <Card(id=1, card_id=3211222001, card_user=yoyo ...)> yoyo
这篇关于SQLAlchemy学习-4.一对一关系的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享