2017-09-12 5 views
1

私はSQLAlchemyを初めて使用しています。SQLAlchemyを使用して練習プロジェクトを構築しようとしています。次の関係を持つテーブルを含むデータベースを作成しました。今私の質問は以下のとおりです。SQLAlchemy(flask_sqlalchemyまたはflask-mergeではなく)を使用して相互関係テーブルにデータを挿入する方法はありますか?

  1. 彼らは相互に依存しているとしてテーブルにデータを挿入する方法?
  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の中にソリューションを提供し、私は、Python 3.6を使用していてください。

+0

私はhttps://stackoverflow.com/a/10458105/4995451 、あなたはループの関係について、この答えを読むべきだと思うが、あなたがこのような構造を維持したい場合は、 'NULL可能= true'をとの関係を作ることができます。あなたは別のテーブルの前に1つのテーブルを挿入することができます –

+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テーブル**の2つ(またはそれ以上)のレコードは、**同じdepartment_id **を持つ両方(またはすべて)の間に 'is_manager = True'を持つことができます。 – Sunil

    関連する問題