sqlalchem表关联(一对多,一对一,多对多)
简介:#
sqlalchemy是我们在python中经常使用的ORM组件,用来把python和数据库模型连接起来。
让用的关系型数据库,ms_sql_server , mysql,mariadb都是关系型数据库,那么我们一定要处理数据库之间的关系。
本文将探索使用sqlalchemy对数据库关系进行定义,并结合flask的开发,明确在flask-admin当中如何快速实现这种关系。
一:多对一#
1.很多工人在一个班组,很多人拥有相同的学历。那么我们就要在工人这个页面单选所属班组,学历等级。
2.模型定义:

class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) users = relationship("Users", back_populates="group") name = Column(String(32)) def __str__(self): return self.name class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) group_id = Column(Integer, ForeignKey('group.id')) group = relationship("Group", back_populates="users") name = Column(String(32)) def __str__(self): return self.name
3.测试:
在flask-admin当中管理Users表时,可以单选一个班组名称。
在flask-admin当中管理Group表时,可以多选用户。但是候选用户时所有用户,如果某个用户已经有一个所属班组,那么更新操作会覆盖这个用户之前的所属班组。
日常操作,一般时在用户页修改所属班组,极少在班组页面进行多选添加成员。而数据定义当中的Group.users,是方便进行双向连接,可以根据班组查询用户的。如果没有其它功能需要读取这个列表,那么可以取消这个定义。
如果需要这个操作,那么可以考虑在flask-admin中使用自定义视图的方式,不在创建,编辑表单中显示这个字段。
class Group_view(ModelView): form_excluded_columns = ('users',)
admin.add_view(ModelView(Users, session, name='用户')) #系统默认视图注册 admin.add_view(Users_view(Users, session, name='用户')) #使用自定义视图注册。
二:多对多#
1.每个班组都有工长,副工长。
2.模型定义:

group_duties = Table('group_duties', Base.metadata, Column('group_id', Integer, ForeignKey('group.id')), Column('duties_id', Integer, ForeignKey('duties.id')) ) class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) name = Column(String(32)) duties = relationship("Duties", secondary=group_duties) def __str__(self): return self.name class Duties(Base): __tablename__ = 'duties' id = Column(Integer, primary_key=True) name = Column(String(32)) group = relationship("Group", secondary=group_duties) def __str__(self): return self.name class Duties_views(ModelView): form_excluded_columns = ('group',)
3.测试
无论是班组表还是职务表,都可以进行多选。而且互相并不影响,但是实际使用中,一般是会对班组进行操作,对班组设置职务,而不是在职务选择班组,所以像多对一一样,我在表单隐藏了一项。
4.删除
当使用多对多关系时,我们同时使用了3张表,flask-admin只管理了两张表,第三张表作为中间表,当在flask-admin当中删除任意一项时,会自动处理中间表,删除中间表和该数据相关的条目。
三:一对一#
1.我认为这个一对一是垂直分表来使用的东西。当数据口够大的时候,垂直分表,甚至分库,将是有效提升执行效率的办法。
2.源码:

class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(32)) ext = relationship("User_ext", uselist=False, back_populates="user") def __str__(self): return self.name class User_ext(Base): __tablename__ = 'user_ext' id = Column(Integer, primary_key=True) name = Column(String(32)) user_id = Column(Integer, ForeignKey('user.id')) user = relationship("User", back_populates="ext") def __str__(self): return self.name
3.实验:
主表或扩展表,都可以进行单选,选择另一个表的内容,但是和前面介绍的一样,最后一次操作,覆盖前期数据。
4.暂时真不知道怎么用,也不会实现垂直分表。继续查资料把。
四:#
五:#
六:#
七:#
八:#
九:#
十:#
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/9472274.html
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!