code generator (1) ,sqlalchemy实作关系类,多对多关系

最近在做一个code generator ,主要是将umlstar中的类图,转换成python代码,用来产生数据库和一些手脚架代码。



什么是关系类

如下图,task(任务)与employee(员工)无关系的两个类,因为任务要分配给员工,而加入了partener(参与者)将两个类连接起来,一个task可分配给多个employee,一个employee可以分配多个任务,task与employee是多对多关系。

code generator (1) ,sqlalchemy实作关系类,多对多关系_第1张图片

 在代码中表现为

 
  
 
  
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

 
  

 
  

 
  
 
  
 
  
 
  
 
  
 
 

你可能感兴趣的:(python,架构)