gpt4 book ai didi

python - 为什么 SQLAlchemy/associationproxy 会复制我的标签?

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:30 28 4
gpt4 key购买 nike

我正在尝试为标签使用关联代理,在与 the example in the docs 非常相似的场景中.这是我的模式的一个子集(它是一个博客),使用声明:

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')]

标签 u'bar' 已经存在,id 为 2;为什么 SQLAlchemy 不只是附加那个而不是尝试创建它?我的架构是否有问题?

最佳答案

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

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

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

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

如何解决?使 tags.tag 为主键可以说是正确的做法,尽管我不知道这有多有效,也不知道 SQLAlchemy 处理它的效果如何。如果做不到这一点,请在将它们分配给条目之前尝试按名称查询 Tag 对象。您可能需要编写一个小的实用函数,它接受一个 unicode 字符串并返回一个现有标签或为您创建一个新标签。

关于python - 为什么 SQLAlchemy/associationproxy 会复制我的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899984/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com