为什么 SQLAlchemy/associationproxy 重复我的标签?

2024-04-17

我正在尝试在与标签非常相似的情况下使用关联代理文档中的示例 http://www.sqlalchemy.org/docs/05/reference/ext/associationproxy.html。这是我的架构的一个子集(它是一个博客),使用声明式:

class Tag(Base):
    __tablename__ = 'tags'
    id            = Column(Integer, primary_key=True)
    tag           = Column(Unicode(255), unique=True, nullable=False)

class EntryTag(Base):
    __tablename__ = 'entrytags'
    entry_id      = Column(Integer, ForeignKey('entries.id'), key='entry', primary_key=True)
    tag_id        = Column(Integer, ForeignKey('tags.id'), key='tag', primary_key=True)

class Entry(Base):
    __tablename__ = 'entries'
    id            = Column(Integer, primary_key=True)
    subject       = Column(Unicode(255), nullable=False)
    # some other fields here
    _tags         = relation('Tag', backref='entries', secondary=EntryTag.__table__)
    tags          = association_proxy('_tags','tag')

这是我尝试使用它的方法:

>>> e = db.query(Entry).first()
>>> e.tags
[u'foo']
>>> e.tags = [u'foo', u'bar']  # really this is from a comma-separated input
db.commit()
Traceback (most recent call last):
[...]
sqlalchemy.exc.IntegrityError: (IntegrityError) duplicate key value violates unique constraint "tags_tag_key"
 'INSERT INTO tags (id, tag) VALUES (%(id)s, %(tag)s)' {'tag': 'bar', 'id': 11L}
>>> map(lambda t:(t.id,t.tag), db.query(Tag).all())
[(1, u'foo'), (2, u'bar'), (3, u'baz')]

The tag u'bar'已存在,id 为 2;为什么 SQLAlchemy 不只是附加那个而不是尝试创建它?我的模式是不是有问题?


免责声明:自从我使用 SQLAlchemy 以来已经有很长时间了,所以这更多的是一个猜测。

看起来您期望 SQLAlchemy 在对多对多表执行插入时神奇地获取字符串“bar”并查找它的相关标签。我预计这是无效的,因为相关字段(“标签”)不是主键。

想象一下类似的情况,您的 Tag 表实际上是 Comment,也带有 id 和文本字段。您希望能够使用上面使用的相同 e.comments = ['u'Foo', 'u'Bar'] 语法向条目添加注释,但您希望它只执行插入,不检查是否有相同内容的现有注释。

所以这可能就是它在这里所做的,但它会遇到标签名称的唯一性约束并失败,假设您试图做错误的事情。

如何修复它?将 tag.tag 作为主键可以说是正确的做法,尽管我不知道这样做的效率如何,也不知道 SQLAlchemy 处理它的效果如何。如果失败,请尝试按名称查询 Tag 对象,然后再将它们分配给条目。您可能需要编写一个小实用函数,它接受一个 unicode 字符串,然后返回现有标签或为您创建一个新标签。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 SQLAlchemy/associationproxy 重复我的标签? 的相关文章

随机推荐