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

最近在做一个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









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值