最近在做一个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的数据
参考
http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html