加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – SQLAlchemy双向关联代理

发布时间:2020-12-20 13:36:52 所属栏目:Python 来源:网络整理
导读:我正在尝试使用映射表创建一个简单的多对多关系,该映射表包含有关它使用SQLAlchemy在两端的关联代理表示的关系的元数据.但是,我似乎无法让它发挥作用.这是我一直在努力解决的玩具示例: Base = declarative_base()def bar_creator(bar): _ = FooBar(bar=bar)
我正在尝试使用映射表创建一个简单的多对多关系,该映射表包含有关它使用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)

我添加了创建者函数,所以我可以避免编写一个__init__,它不适用于我的实际用例(采用单个参数),并且在每个函数中都包含了FooBar的创建,因为我在一些文档中读到了要追加的项目需要已经有一个与之关联的链接表实例.我确定我只是错过了一些明显的东西(或者甚至可能尝试做一些无法做到的事情),但是经过深入挖掘文档和谷歌搜索,我无法弄清楚为什么它不起作用.我究竟做错了什么?

解决方法

你的问题在于创建者:它应该返回FooBar的新实例,而不是bar或foo:

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

和foo_creator类似.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读