首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多关系抛出异常的SqlSoup relate()

多对多关系抛出异常的SqlSoup relate()
EN

Stack Overflow用户
提问于 2010-12-01 07:01:14
回答 1查看 806关注 0票数 0

我使用以下代码在现有数据库中使用SqlSoup。

代码语言:javascript
复制
import sqlalchemy
from sqlalchemy.ext.sqlsoup import SqlSoup
from sqlalchemy.orm import backref

engine = sqlalchemy.create_engine('postgresql:///test')
db = SqlSoup(engine)
db.books.relate('author', db.authors)
db.books.relate('tags', db.tags, secondary=db.tags2books, backref=backref('books', lazy=False))

然而,最后一次relate()调用抛出了一个异常:

代码语言:javascript
复制
Traceback (most recent call last):
  File "sqlsoup-test.py", line 10, in <module>
    db.books.relate('tags', db.tags, secondary=db.tags2books, backref=backref('books', lazy=False))
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/ext/sqlsoup.py", line 384, in relate
    class_mapper(cls)._configure_property(propname, relationship(*args, **kwargs))
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/mapper.py", line 758, in _configure_property
    prop.init()
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/interfaces.py", line 476, in init
    self.do_init()
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/properties.py", line 895, in do_init
    self._determine_joins()
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/properties.py", line 1010, in _determine_joins
    self.secondary)
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/properties.py", line 1002, in _search_for_join
    return join_condition(mapper.local_table, table)
  File "/usr/lib64/python2.6/site-packages/sqlalchemy/sql/util.py", line 219, in join_condition
    for fk in b.foreign_keys:
AttributeError: 'MappedTags2books' object has no attribute 'foreign_keys'

这些表是使用以下定义创建的:

代码语言:javascript
复制
authors_table = Table('authors', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String, nullable=False, index=True)
)

books_table = Table('books', metadata,
    Column('id', Integer, primary_key=True),
    Column('author_id', Integer,
        ForeignKey('authors.id', onupdate='CASCADE', ondelete='CASCADE'),
        nullable=False),
    Column('title', String, nullable=False, index=True)
)

tags_table = Table('tags', metadata,
    Column('id', Integer, primary_key=True),
    Column('tag', String, index=True, unique=True, nullable=False)
)

tags2books_table = Table('tags2books', metadata,
    Column('tag_id', Integer,
        ForeignKey('tags.id', onupdate='CASCADE', ondelete='CASCADE'),
        primary_key=True),
    Column('book_id', Integer,
        ForeignKey('books.id', onupdate='CASCADE', ondelete='CASCADE'),
        primary_key=True)
)

如果你要问“既然他可以使用真正的SqlSoup,为什么还要使用SQLAlchemy?":我正在写一篇关于SQLAlchemy的学期论文,我在一章中提到了SqlSoup,我想加一个例子。还有什么比使用我在SA示例中使用的数据库更容易的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-01 19:31:01

看起来secondary不能是一个映射类。传递一个表会修复错误:

代码语言:javascript
复制
db.books.relate('tags', db.tags, secondary=db.tags2books._table, backref=backref('books', lazy=False))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4319610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档