一对一 不理解
多对多: 一个老师会对应多个班级 1个班级也可能对应多个老师,多个班级对应多个老师就是多对多的关系
有一个老师的表格 一个学生的表格 一个老师学生对应关系的中间表格
多对多的实现是通过建立一个中间表的方式实现的:
同理:
基础程序:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer,Column,String,DECIMAL,Boolean,ForeignKey,TEXT
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import Table
# 连接数据库
# 地址
HOSTNAME = '127.0.0.1'
# 数据库
# 几栋
DATABASE = 'relation'
# 端口
# 门牌号
PORT = 3306
# 用户名和密码
# 钥匙
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URL)
# 都要继承这个函数生成的基类
Base = declarative_base(engine)
teacher表和classes表:
class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(50))
classes = relationship('Classes',backref='teacher',secondary=teacher_classes)
def __str__(self):
return 'Teacher(name:%s)' % self.name
class Classes(Base):
__tablename__ = 'classes'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
def __str__(self):
return 'Classes(name:%s)' % self.name
中间表:
teacher_classes = Table(
'teacher_classes',
Base.metadata,
Column('teacher_id',Integer,ForeignKey('teacher.id')),
Column('classes_id',Integer,ForeignKey('classes.id'))
)
这样,就把两张表形成多对多的关系
生成表和添加数据:
Base.metadata.create_all()
Session = sessionmaker(bind=engine)
session = Session()
teacher1 = Teacher(name='jerry')
teacher2 = Teacher(name='amy')
classes1 = Classes(name='基础班')
classes2 = Classes(name='进阶班')
# print(teacher1.classes) # 如果不添加东西默认是空的列表 可以用append
teacher1.classes.append(classes1)
teacher1.classes.append(classes2)
teacher2.classes.append(classes1)
teacher2.classes.append(classes2)
session.add(teacher1)
session.add(teacher2)
session.commit()
查看表内容:
# 根据老师查班级
teacher = session.query(Teacher).first()
#print(teacher)
for item in teacher.classes:
print(item)
# 根据班级查老师
classes = session.query(Classes).first()
for item in classes.teacher:
print(item)