sqlalchemy外键和relationship查询
前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作。前面两篇文章都是作为铺垫,为下面的文章打好基础。记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循序渐进的过程”,而我的就是按照这样思路来学习数据库外键。首先是了解外键基础理论,然后是sqlalchemy基本操作,最后才到sqlalchemy操作外键。
1|0一、sqlalchemy体现的外键特性
1|11.外键回顾
外键的出现是因为两张表之间需要有关联,为了保证数据的完整性和唯一性而产生的。有外键时会有两张以上的表,分为主表和附表。附表中数据往往是主表中数据的延伸,附表中有外键关联到主表的主键上。
在sqlalchemy的ORM模型中,定义表时指定主键和外键。
主键定义:在字段信息后面加上primary_key=True
外键定义:在字段后面加上Foreignkey(主表.主键)
另外在定义主键时往往还会定义一个relationship,什么作用呢?下文见分晓。
1|22.定义表
定义两张表,company和phone,company中的name是主键,phone中的id是主键,并且phone中定义company_name为外键。
sql_foreign_models.py
1|33.创建表
1|44.插入数据
sql_insert.py
sql_foreign_insert.py
写入数据库
1|55.sqlalchemy外键操作
总结外键的优点有两个:保证数据的完整性和保证数据的一致性。那么在sqlqlchemy如何体现完整性和一致性呢?通过数据的插入和删除来体现。
完整性:附表插入数据时会检查外键所在字段在主表中是否存在
在phone表中插入数据:(7,Blackberry,“RIM”,3200)黑莓手机,所在公司是RIM。
报错:不能添加或者更新一个子行,有一个外键关联。
因为主表company的主键,也就是phone外键关联的字段没有“RIM”,所以当phone写入数据时会检查company_name字段的值是否在company中存在。而company中不存在该值,所以不能写入。这样做就保证了数据的完整性。
一致性:一致性表现在增删改查外键时,主表相对应数据的处理。一致性的规则有多个,具体如下引用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 外键约束对父表的含义: 在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的 on update/ on delete子句, InnoDB支持5种方式, 分列如下 . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用 . set null 方式 在父表上update/delete记录时,将子表上匹配记录的列设为 null 要注意子表的外键列不能为not null On delete set null 从mysql3.23.50开始可用; on update set null 从mysql4.0.8开始可用 . No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 这个是ANSI SQL-92标准,从mysql4.0.8开始支持 . Restrict方式 同no action, 都是立即检查外键约束 |
删除主表中的name=Sungsum的记录。
默认的外键关联的动作是 “.set null”,即主表删除数据,附表中关联的字段设为空。
除了默认的设置外,还可以选择:
1、删除主表数据,如果附表有记录则不允许删除
2、删除主表数据,如果附表有记录则一并删除
2|0二、外键和查询
在数据结构上外键对连表查询并没有太多的帮助,但是在sqlalchemy的模型下外键对连表查询有一定的优化,那就是relationship字段,其配合外键一起使用。
在没有relationship字段时,如果想要查询xiaomi2s手机的生产公司的地址如何查询呢?分为两步走:
- 查询出phone表中xiaomi2s的company_name字段
- 通过company_name字段查询company表中的location字段。(phone.company_name==company.name)
有了relationship之后就不用分为两步走了,只需要一步就能搞定。在定义表的模型时,relationship将company和phone表关联在一起。phone表中定义:
表明将phone表和Company表联系在一起。backref是反向关联,使用规则是:
- company是主表,phone是从表。查询phone表,返回phone_obj,可以通过phoen_obj.Company查询到company中外键关联的数据。查phone表返回company表里的数据。这个称之为:正向查询。
- company是主表,phone是从表。查询company表,返回company_obj,可以通过company_obj.phone_of_company查询到phone表的外键关联数据。查company表返回phone表里的数据。这个称之为:反向查询。
2|11.正向查询
通过查询phone得到company表中的字段,起作用的是relationship中的Company字段。
2|22.反向查询
通过查询company得到phone表中的字段,起作用的是relationship中的phone_of_compamy字段。
外键还有更多操作,比如在删除主表时附表的动作。等到下次需要使用时再补上,我相信不会等太久。
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/9269880.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)