热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python全栈之旅:SQLAlchemyORM中的外键与关系

本文探讨了SQLAlchemyORM框架中如何利用外键和关系(relationship)来建立表间联系,简化复杂的查询操作。通过示例代码详细解释了relationship的定义、使用方法及其与外键的相互作用。

在SQLAlchemy ORM框架中,relationship用于定义模型类之间的关联关系,从而简化了跨表的数据查询操作。这种关联虽然不直接影响数据库的物理结构,但极大地增强了代码的可读性和维护性。


为了正确地使用relationship,必须先在相关表中定义外键(ForeignKey)。外键确保了数据库层面的数据完整性,而relationship则是在ORM层面上提供了一种更加直观的方式来处理这些关联数据。


如果没有正确设置外键,尝试使用relationship时将引发错误,例如:sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Father.son - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a ‘primaryjoin’ expression.


relationship的使用场景包括但不限于一对多、多对一、多对多等复杂的数据关系。通过定义relationship,可以直接访问关联表的数据,而无需显式执行JOIN操作,这不仅提高了查询效率,也使得代码更为简洁。



 1 import sqlalchemy
2 from sqlalchemy import create_engine
3 from sqlalchemy import Column, String, Integer, ForeignKey
4 from sqlalchemy.orm import sessionmaker, relationship
5 from sqlalchemy.ext.declarative import declarative_base
6
7 engine = create_engine("mysql+pymysql://root:root@127.0.0.1/t1")
8
9 Base = declarative_base()
10
11 class Father(Base):
12 __tablename__ = "father"
13
14 id = Column(Integer, primary_key=True, autoincrement=True)
15 name = Column(String(40), unique=True)
16 age = Column(Integer)
17 sOns= relationship('Son', backref='father')
18
19 class Son(Base):
20 __tablename__ = 'son'
21
22 id = Column(Integer, primary_key=True, autoincrement=True)
23 name = Column(String(40), unique=True)
24 age = Column(Integer)
25 father_id = Column(Integer, ForeignKey('father.id'))
26
27 Base.metadata.create_all(engine)
28
29 Session = sessionmaker(bind=engine)
30 session = Session()
31
32 # 示例代码
33 father = Father(name='John Doe', age=35)
34 son1 = Son(name='Jane Doe', age=10, father=father)
35 son2 = Son(name='Jack Doe', age=8, father=father)
36 session.add_all([father, son1, son2])
37 session.commit()
38
39 # 查询父亲及其子女
40 father_query = session.query(Father).filter_by(id=1).first()
41 for son in father_query.sons:
42 print(f'Name: {son.name}, Age: {son.age}')
43
44 # 查询特定子的父
45 son_query = session.query(Son).filter_by(id=1).first()
46 print(f'Father Name: {son_query.father.name}, Father Age: {son_query.father.age}')


以上代码展示了如何通过relationship直接访问关联表的数据,避免了繁琐的JOIN操作,使代码更加简洁高效。


推荐阅读
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 代码生成器实战教程:提升编程效率的利器
    本系列文章旨在通过一系列实践案例,详细介绍如何利用代码生成器提高开发效率。本文将引导您完成从下载安装到实际应用的全过程。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
  • javascript——对象的概念——函数 1 (函数对象的属性和方法)
    一、创建函数函数是一种对象:Function类是对象,可以通过Function实例化一个函数,不过最多的还是利用function来创建函数。方式一:利用Function类来实例化函 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • UMPlatForm.NET 5.1 版本数据字典管理功能解析
    本文介绍了 UMPlatForm.NET 5.1 版本中的数据字典管理模块,探讨了该模块如何支持平台的数据共享与管理,以及如何通过用户和角色权限来增强系统的安全性。 ... [详细]
  • Flask中路由的基础定义与应用
    本文介绍了如何在Flask框架中通过装饰器为视图函数指定访问路径,并详细讲解了带参数路由及指定请求方法的实现方式。 ... [详细]
  • 本文探讨了HTA(HTML Application)环境中HTML5 IndexedDB的可用性问题,并提供了一种替代方案,即通过使用COM ActiveX对象来实现数据存储功能。 ... [详细]
  • 探讨并提供解决方案以应对 'view is not in the window hierarchy' 的错误提示。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
author-avatar
长江7808
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有