2013-08-23 2 views
3

SQLAlchemy를 사용하여 양쪽 끝의 연결 프록시로 나타내는 관계에 대한 메타 데이터가 들어있는 매핑 테이블을 사용하여 여러 다 대다 관계를 만들려고합니다. 그러나, 나는 그것이 작동하도록 할 수 없습니다. 여기를 알아 내기 위해 내가 시도하는 작업했던 장난감 예제 : 나는 (내 실제 사용 사례에 대해 작동하지 것이다 __init__를 작성 피할 수 있도록 SQLAlchemy 양방향 연결 프록시

Base = declarative_base() 


def bar_creator(bar): 

    _ = FooBar(bar=bar) 
    return bar 


class Foo(Base): 

    __tablename__ = 'foo' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    bars = association_proxy('bar_associations', 'bar', 
          creator=bar_creator) 


def foo_creator(foo): 

    _ = FooBar(foo=foo) 
    return foo 


class Bar(Base): 

    __tablename__ = 'bar' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    foos = association_proxy('foo_associations', 'foo', 
          creator=foo_creator) 


class FooBar(Base): 

    __tablename__ = 'fooBar' 

    foo_id = Column(Integer, ForeignKey('foo.id'), primary_key=True) 
    bar_id = Column(Integer, ForeignKey('bar.id'), primary_key=True) 
    bazed = Column(Boolean) 
    foo = relationship(Foo, backref='bar_associations') 
    bar = relationship(Bar, backref='foo_associations') 


Base.metadata.create_all(engine) 
make_session = sessionmaker(bind=engine) 
session = make_session() 
foo0 = Foo(name='foo0') 
session.add(foo0) 
bar0 = Bar(name='bar0') 
foo0.bars.append(bar0) 

내가 creator 기능을 추가 단일 인수를 취), 첨부 된 항목이 이미 연관된 연결 테이블 인스턴스가 있어야하는 일부 문서를 읽었 기 때문에 각각에 FooBar을 작성했습니다. 나는 분명히 (또는 어쩌면 그냥 할 수없는 일을하려고 시도하는) 명백한 것을 놓치고있을 것이라고 확신하지만, 문서 및 인터넷 검색을 통해 많은 파고를 본 후에 왜 작동하지 않는지 알 수 없다. . 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

정확하게 작동하지 않는 이유를 설명해 주시겠습니까? 나는 당신이 협회 프록시를 위해'창조자 '기능을 필요로하는 이유를 보지 못한다. – javex

+1

제작자와 함께 또는 제작자 없이는 작동하지 않지만 제작자는 조금 더 나아지게 만듭니다. foo0.bars에 bar0을 추가 할 때 emit_backref_from_collection_append_event child_impl = child_state.manager [key] .impl에서 sqlalchemy/orm/attributes.py의 foo 키 오류가 발생합니다 "줄 1140, –

답변

1

귀하의 문제는 creator에있다 : 그것은 FooBar하지 bar 또는 foo의 새 인스턴스를 반환해야합니다 :

def bar_creator(value): 
    return FooBar(bar=value) 

와 유사한을 foo_creator 위해.

+0

오, 그건 의미가 있습니다. , 고마워. 나는 그것이 어리 석고 명백한 무엇인가 알았다. .. –