2017-09-12 3 views
1

SQLAlchemy에 익숙하지 않아 SQLAlchemy를 사용하여 연습 프로젝트를 작성하려고합니다. 다음과 같은 관계로 테이블을 포함하는 데이터베이스를 만들었습니다. 이제 내 질문은 :SQLAlchemy (flask_sqlalchemy 또는 flask-merge가 아님)를 사용하여 상호 관계 테이블에 데이터를 삽입하는 방법은 무엇입니까?

  1. 방법 INSERT 데이터를 테이블에가 상호 의존적으로?
  2. 이것은 데이터베이스 디자인에서 루프를 형성합니까?
  3. 루핑 데이터베이스 디자인이 좋지 않습니까? 나쁜 행동이라면 어떻게 해결할 수 있습니까?

    Department.manager_ssn ==> Employee.SSN

    Employee.department_id ==> Department.deptid

database relationship diagram

와 다음 코드의 정확한 생성이 현재 버전 데이터 베이스.

# Department table 
class Departments(Base): 
    __tablename__ = "Departments" 

    # Attricutes 
    Dname= Column(String(15), nullable=False) 
    Dnumber= Column(Integer, primary_key=True) 
    Mgr_SSN= Column(Integer, ForeignKey('Employees.ssn'), nullable=False) 
    employees = relationship("Employees") 

# Employee table 
class Employees(Base): 
    __tablename__ = "Employees" 

    # Attributes 
    Fname = Column(String(30), nullable=False) 
    Minit = Column(String(15), nullable=False) 
    Lname = Column(String(15), nullable=False) 
    SSN = Column(Integer, primary_key=True) 
    Bdate = Column(Date, nullable=False) 
    Address = Column(String(15), nullable=False) 
    Sex = Column(String(1), default='F', nullable=False) 
    Salary = Column(Integer, nullable=False) 
    Dno = Column(Integer, ForeignKey('Departments.Dnumber'), nullable=False) 
    departments = relationship("Departments") 

은하지 플라스크-SQLAlchemy의 또는 플라스크 - 마이그레이션에 SQLAlchemy의에서 솔루션을 제공하십시오 나는 파이썬 3.6 사용하고 있습니다.

+0

는 난 당신이 루프 관계에 대한이 답변, https://stackoverflow.com/a/10458105/4995451을 읽어야 생각 하지만 당신은 당신이 널 (NULL) = TRUE ''과의 관계를 만들 수있는이 구조를 유지하려는 경우. 그래서 당신은 다른 테이블 앞에 하나의 테이블을 삽입 할 수 있습니다 –

+1

@ faisalburhanudin, 내 문제를 해결해 줘서 고마워. – Sunil

답변

0

당신은 직원이 관리자 경우 표시하기 위해 관계

  • 사용 부울 플래그의 한 측면에 외부 키 제약 조건을 선언

    • 에 의해 모두 같은 순환 참조 설계를 방지 할 수 있습니다
      class Department(Base): 
          __tablename__ = 'departments' 
      
          department_id = Column(Integer, primary_key=True) 
          employees = relationship('Employee', lazy='dynamic', back_populates='department')  
      
      
      class Employee(Base): 
          __tablename__ = 'employees' 
      
          employee_id = Column(Integer, primary_key=True) 
          is_manager = Column(Boolean, nullable=False, default=False) 
          department_id = Column(Integer, ForeignKey('departments.department_id'), nullable=False) 
      
          department = relationship('Department', back_populates='employees') 
      

      사용 부서의 관리자를 찾을 수 있습니다

      department = session.query(Department).get(..) 
      department.employees.filter(Employee.is_manager == True).one_or_none() 
      
  • +0

    이것이 올바른 것처럼 보일지라도 ** is_manager ** 열에 너무 많은'False'가있는 데이터 중복성이 추가됩니다. 해결책을 가져 주셔서 감사합니다. 나는 경험있는 사람에게 대답이 올바른지를 결정하게 할 것이다. – Sunil

    +0

    IMO "중복"열은 그만한 가치가 있습니다. 원형 테이블 참조는 관리하기에 큰 고통입니다. 비정규 화 데이터는 특정 검색어 최적화에서 도움이 될 수 있으므로 반드시 나쁜 것은 아닙니다. 'session.query (Employee) .filter (Employee.is_manager == True) .all()'은 모든 관리자를 반환합니다. –

    +0

    이 솔루션을 사용하면 같은 부서에 둘 이상의 관리자를 추가 할 수 있습니다. ** Employee 테이블 **의 두 개 (또는 그 이상) 레코드는 ** 같은 department_id **를 갖는 둘 다 (또는 모두) 동안 'is_manager = True'를 가질 수 있습니다. – Sunil