sqlalchemy多对多查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | # coding:utf-8 from sqlalchemy import create_engine, Column, String, Integer, ForeignKey, Table from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship DB_URI = "mysql+pymysql://root:123123sdt@127.0.0.1:3306/xiachufang" engine = create_engine(DB_URI) Base = declarative_base(engine) session = sessionmaker(engine)() # 创建一个多对多的关系(老师与学生的关系)需要创建一个中间表 # 创建一个中间表 teacher_classes = Table( "teacher_classes" , Base.metadata, Column( "teacher_id" , Integer, ForeignKey( "teacher.id" ), nullable = False , primary_key = True ), Column( "classes_id" , Integer, ForeignKey( "classes.id" ), nullable = False , primary_key = True ) ) # 创建老师的映射 class Teacher(Base): __tablename__ = "teacher" id = Column(Integer, primary_key = True , autoincrement = True ) teacher_name = Column(String( 100 )) classes = relationship( "Classes" , secondary = teacher_classes) def __repr__( self ): return "<Teacher id='%s' teacher_name='%s'>" % ( self . id , self .teacher_name) # 创建学生的映射 class Classes(Base): __tablename__ = "classes" id = Column(Integer, primary_key = True , autoincrement = True ) classes_name = Column(String( 100 )) teacher = relationship( "Teacher" , secondary = teacher_classes) def __repr__( self ): return "<Classes id='%s' classes_name='%s'>" % ( self . id , self .classes_name) # # # 创建数据库 # Base.metadata.create_all() # # 创建两个老师 # teacher1 = Teacher(teacher_name='admin') # teacher2 = Teacher(teacher_name='grunt') # teacher3 = Teacher(teacher_name='shuihen') # # 创建两门课程 # classes1 = Classes(classes_name="java") # classes2 = Classes(classes_name="python") # # # 添加数据 # teacher1.classes = [classes1,classes2] # teacher2.classes = [classes1,classes2] # teacher3.classes = [classes1] # session.add(teacher1) # session.add(teacher2) # session.add(teacher3) # session.commit() # # 查询下数据(根据老师查询课程) # # teacher = session.query(Teacher).first() # # print teacher.classes # # # 根据课程查询老师 # classes = session.query(Classes).get(1) # print classes.teacher # # # 根据老师查询课程 # teacher = session.query(Teacher).get(3) # print teacher.classes |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下