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
을 작성했습니다. 나는 분명히 (또는 어쩌면 그냥 할 수없는 일을하려고 시도하는) 명백한 것을 놓치고있을 것이라고 확신하지만, 문서 및 인터넷 검색을 통해 많은 파고를 본 후에 왜 작동하지 않는지 알 수 없다. . 내가 도대체 뭘 잘못하고있는 겁니까?
정확하게 작동하지 않는 이유를 설명해 주시겠습니까? 나는 당신이 협회 프록시를 위해'창조자 '기능을 필요로하는 이유를 보지 못한다. – javex
제작자와 함께 또는 제작자 없이는 작동하지 않지만 제작자는 조금 더 나아지게 만듭니다. foo0.bars에 bar0을 추가 할 때 emit_backref_from_collection_append_event child_impl = child_state.manager [key] .impl에서 sqlalchemy/orm/attributes.py의 foo 키 오류가 발생합니다 "줄 1140, –