2013-08-23 84 views
3

我试图创建一个简单的多对多关系与映射表,它包含元数据关于它代表的关系使用SQLAlchemy两端关联代理的关系。但是,我似乎无法让它工作。这里的玩具例子中,我一直在与试图搞清楚: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功能,这样我就能避免编写一个__init__不会对我的实际使用情况下工作(需要单独的参数),并且在每个文件中都包含了创建FooBar,因为我在某些文档中阅读了要附加的项目需要已经有与其关联的链接表实例。我确信我只是缺少一些显而易见的东西(或者甚至试图做一些无法完成的事情),但是在深入研究文档和Google搜索之后,我无法弄清楚为什么它不起作用。我究竟做错了什么?

+0

你能解释一下哪些方法无效吗?我没有看到为什么你需要关联代理的'creator'函数的原因。 – javex

+1

它不适用于创作者,也不适用于创作者,但创作者似乎让它进一步发展。我从sqlalchemy/orm/attributes.py中获得foo的关键错误,第1140行,在emit_backref_from_collection_append_event中,child_impl = child_state.manager [key] .impl,当将bar0附加到foo0.bars时 –

回答

1

你的问题就出在creator:它应该返回的FooBar而不是barfoo新实例:

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

和类似的foo_creator

+0

哦,这很有道理。 ,谢谢,我知道这会是一些愚蠢而明显的事情...... –