最近在做一个code generator ,主要是将umlstar中的类图,转换成python代码,用来产生数据库和一些手脚架代码。
什么是关系类
如下图,task(任务)与employee(员工)无关系的两个类,因为任务要分配给员工,而加入了partener(参与者)将两个类连接起来,一个task可分配给多个employee,一个employee可以分配多个任务,task与employee是多对多关系。
在代码中表现为
Base = declarative_base()
class Task(Base):
__tablename__ = 'task'
#记得为多对多关系设定 secondary
employees =relationship("Employee",secondary="partener")
# task与表partener为一对多关系
parteners = relationship("Partener", back_populates="task",
lazy="dynamic", cascade="all, delete-orphan")
id = db.Column(db.Integer, primary_key=True, nullable=False,unique=True)
class Partener(Base):
#关系类,关联task,employee
__tablename__ = 'partener'
id = db.Column(db.Integer, primary_key=True, nullable=False,unique=True)
task_id= db.Column(db.Integer,db.ForeignKey("task.id"),nullable=False)
task = relationship("Task", foreign_keys=[task_id],uselist=False)
employee_id= db.Column(db.Integer,db.ForeignKey("employee.id"),nullable=False)
employee = relationship("Employee", foreign_keys=[employee_id],uselist=False)
class Employee(Base):
__tablename__ = 'employee'
id = db.Column(db.Integer, primary_key=True, nullable=False,unique=True)
parteners = relationship("Partener", back_populates="employee",
lazy="dynamic", cascade="all, delete-orphan")
name = db.Column(db.String(50))
# 记得为多对多关系设定 secondary
tasks =relationship("Task",secondary="partener")
在task删除时会将关联parteners删除,在employee删除时会将关联parteners删除.
新增数据时可以这样操作
task =Task()
employee=Employee()
task.employees.append(employee)
dbsession.add(task)
dbsession.commit()
这样,关联表partener也会自动存入一表关联task和employee的数据