热门标签 | 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操作,使代码更加简洁高效。


推荐阅读
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • Yii 实现阿里云短信发送 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
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社区 版权所有