2012-07-11 3 views
0

세 개의 테이블 : 장치, 슬롯, 포트가 있습니다.세 테이블 간의 SQLAlchemy 관계

  1. 장치는
  2. 슬롯 여러 포트를해야합니다 여러 개의 슬롯을 가지고 있지만,
  3. 포트는 하나의 슬롯 내 경험에

에 속하는 하나의 장치에 속하는 것,이 같이 나타납니다 : MA에

  1. 장치 (일대) 구멍
  2. 슬롯 (한 ny) 포트

슬롯과 관계없이 모든 관련 Ports 객체를 제공하는 관계를 내 Devices 클래스에 설정하려고합니다. 나는 그것을 이해할 수 없다. 연관 테이블은 가까이에 보이지만, 내가 원하는 것을 수행하는 방법에 대한 예를 구분할 수는 없습니다.

d = session.query(Devices).first() 

d.ports 

모든 지원이 크게 감사합니다 :

class Devices(Base): 
    __tablename__ = 'devices' 
    __table_args__ = { 
    'mysql_engine' : 'MyISAM', 
    'mysql_charset': 'latin1' 
    } 

    did    = Column(INTEGER, primary_key=True) 
    hostname  = Column(VARCHAR(255)) 
    site   = Column(INTEGER, ForeignKey('site.sid'), default=0) 
    model   = Column(INTEGER) 
    fqdn   = Column(VARCHAR(255)) 

    slots = relationship("Slots") 
    changes = relationship("PortStateLog") 
    ports = relationship("Ports", primaryjoin="and_(Slots.device==Devices.did,Ports.slot==Slots.sid)") 


class Slots(Base): 
    __tablename__ = 'slots' 
    __table_args__ = { 
    'mysql_engine' : 'MyISAM', 
    'mysql_charset': 'latin1' 
    } 

    sid   = Column(INTEGER, primary_key=True) 
    device  = Column(INTEGER, ForeignKey('devices.did'), default=None) 
    slot  = Column(VARCHAR(10)) 
    module  = Column(INTEGER) 
    slot_status = Column(INTEGER) 
    card_status = Column(INTEGER) 

    ports = relationship("Ports", primaryjoin="Ports.slot==Slots.sid") 


class Ports(Base): 
    __tablename__ = 'ports' 
    __table_args__ = { 
    'mysql_engine' : 'MyISAM', 
    'mysql_charset': 'latin1' 
    } 

    pid   = Column(INTEGER, primary_key=True) 
    slot  = Column(INTEGER, ForeignKey('slots.sid'), default=None) 
    port  = Column(INTEGER) 
    name  = Column(VARCHAR(200)) 
    status  = Column(INTEGER) 
    description = Column(VARCHAR(200)) 
    op_status = Column(VARCHAR(40)) 
    substatus = Column(INTEGER(4)) 
    type  = Column(INTEGER) 
    clean  = Column(TINYINT(4)) 
    speed  = Column(INTEGER(10)) 
    duplex  = Column(CHAR(1)) 
    sfp   = Column(INTEGER) 

위는 지금까지 .. 나는 단순히 모든 포트를 다시 보려면 아래의 마지막 줄을 원하는 무슨이다.

답변

0

Devices 클래스 정의의 마지막 줄에 포트 관계 정의에 문제가 있다고 생각합니다. 나는 당신의 스키마를 로컬로 사용하기 위해 그것을 제거해야만했다. 또한 __init__ 함수를 포함하지 않았으므로 몇 가지 예제 데이터를 만들 수 있습니다.

난 당신이 이미 알고 확신 해요,하지만 당신은 장치의 슬롯을 반복 할 의사가 있다면 쉽게 장치의 포트 목록과 함께 작업 할 수 있습니다

d1 = session.query(Devices).filter_by(hostname='host1').first() 
for slot in d1.slots: 
    for port in slot.ports: 
     #do something with each Ports object 

중간 슬롯 것을 생략하는 쉬운 방법을 당신이 정말로 슬롯으로 장치의 동일한 수준의 포트를 구성하려면

def ports(self): 
    my_ports = [] 
    for slot in self.slots: 
     my_ports.extend(slot.ports) 
    return(my_ports) 

것은, 당신이 AssociationProxy (아닌 Association를 구성해야합니다 수준은 장치 클래스에 약간의 문법 설탕을 추가하는 것입니다)를 사용하여 항구의 수집. 그러나 many-to-many 관계를 유지하지 않으므로 AssociationProxy는 과도한 것처럼 보이며 pid 목록이 아닌 Ports 객체 목록을 반환하도록 일부 작업을 수행합니다.

+0

답변을 드리지 못해 너무 죄송합니다. 나는 이것을 검토하고이 의견을 갱신하고/문제가 해결되면 승인하겠습니다. 나는 심지어 지금이 고슴도치를 알아 채지 못했다! – Trenton