2015-03-10 2 views
0

Рассмотрим следующую модель (от pythoncentral учебники):SQLAlchemy многие ко многим отношений путаница

class Department(Base): 
    __tablename__ = 'department' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    employees = relationship(
     'Employee', 
     secondary='department_employee_link' 
    ) 


class Employee(Base): 
    __tablename__ = 'employee' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    hired_on = Column(DateTime, default=func.now()) 
    departments = relationship(
     Department, 
     secondary='department_employee_link' 
    ) 


class DepartmentEmployeeLink(Base): 
    __tablename__ = 'department_employee_link' 
    department_id = Column(Integer, ForeignKey('department.id'), primary_key=True) 
    employee_id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    extra_data = Column(String(256)) 
    department = relationship(Department, backref=backref("employee_assoc")) 
    employee = relationship(Employee, backref=backref("department_assoc")) 

Я понимаю, что этот кусок кода устанавливает многие-многие отношения между сотрудниками и depts.Suppose я должен вставить department_id и employee_id в таблицу соединений DepartmentEmployee, как это сделать? В учебнике указано:

>>> IT = Department(name="IT") 
>>> John = Employee(name="John") 
>>> John_working_part_time_at_IT = DepartmentEmployeeLink(department=IT, employee=John, extra_data='part-time') 
>>> s = session() 
>>> s.add(John_working_part_time_at_IT) 
>>> s.commit() 

Но я хочу сделать это отдельно. во-первых, я хочу добавить данные в таблицу отдела, а затем в таблицу сотрудников. Наконец, мне нужно заполнить ссылку Dept-employee, в которой пользователь вводит только столбец extra_data ... Как мне это сделать? я пытался делать что-то вроде этого

def mapper: 
    que=DBSession.query(Department) 
    que2=DBSession.query(Strings) 


         rel=DepartmentEmployeeLink(extra_data=str(x))//__init__ed this 
         rel.department=que 
         rel.employee=que.employees[0].id 

      DBSession.add(rel) 

Это, как я хочу, чтобы вставка произойдет, так как у меня уже есть данные внутри отдела и сотрудника. Может ли кто-нибудь сказать мне, как выполнить это, например, вставить в таблицу ссылок, если у меня есть данные в других двух таблицах?

Я узнал, что есть способ сделать это как «employees.append.xxx», но я не понимаю. Может ли кто-нибудь указать мне в правильном направлении, пожалуйста? Заранее спасибо.

ответ

1

Вот лучший способ определить Many to Many relationship в SQLAlchemy с помощью ассоциации_table.

association_table = Table('department_employee_link', Base.metadata, 
    Column('departmant_id', Integer, ForeignKey('department.id')), 
    Column('employee_id', Integer, ForeignKey('employee.id')) 
) 


class Department(Base): 
    __tablename__ = 'department' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    employees = relationship(
     'Employee', 
     secondary=association_table 
    ) 


class Employee(Base): 
    __tablename__ = 'employee' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    hired_on = Column(DateTime, default=func.now()) 
    departments = relationship(
     Department, 
     secondary=association_table 
    ) 


IT = Department(name="IT") 
John = Employee(name="John") 
IT.employees.append(John) 
s = session() 
s.add(IT) 
s.commit() 
+0

IT = Отдел (имя = "IT") John = Employee (имя = "John") Эти две линии вставки в Департамент и Сотрудника таблицы или просто запрос? Я не думаю, что вы должны s.add (Джон), он выкинет ошибку, пропуская катушку. Документы в Pycentral link не добавляют их. Зачем? Кроме того, можете ли вы рассказать мне, как мне получить список сотрудников в этом отделе в запросе? – Tania

+0

И, если у меня уже есть данные, вставленные в департаменты, как мне добавить сотрудников? SOmething like myvar = DBSession.query (department) .filter (Department = IT); myvar.employees.append (Джон)? Это мой вопрос. И как мне найти отдел сотрудника? – Tania

+0

it_department = s.query (Department) .filter (Department.name = "IT"); it_employees = it_department.employees; erick = Employee (name = "Erick"); it_department.employees.append (erick); s.commit(); john = s.query (Employee) .filter (Employee.name = "John"); johns_departments = john.departments; –

Смежные вопросы